A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 龙瑞麟 于 2015-5-3 01:22 编辑

请大神帮忙分析一下这道题运行的结果,我没搞明白
  1. #include <stdio.h>

  2. int main()
  3. {
  4.     int i = 5, j = 9;
  5.    
  6.     float x = 2.3,  y = 45.;
  7.    
  8.     printf("%8.2f\n", i%(int)(x+y)*j/2/3+y);
  9.    
  10.     return 0;

  11. }
复制代码






14 个回复

正序浏览
1级(左结合)
( ) 圆括号;[ ]下标运算符;->指向结构体成员运算符;. 结构体成员运算符。
2级(右结合)
“ ! ”逻辑非运算符;“ ~ ”按位取反运算符;“ ++ ”前/后缀增量运算符;“ -- ”前/后缀减量运算符;
“ - ”负号运算符;(类型)类型转换运算符;“ * ”指针运算符;“ & ”地址运算符。
3级(左结合)
“ * ” 乘法运算符;“ / ”除法运算符;“ % ” 取余运算符。
4级(左结合)
“ + ”加法运算符;“ - ”减法运算符。
5级(左结合)
<< 左移运算符;>> 右移运算符。
6级(左结合)
<、<=、>、>=关系运算符。
7级(左结合)
“ == ”等于运算符;“ != ”不等于运算符。
8级(左结合)
“ & ”按位与运算符,“~“按位取反运算符”。
9级(左结合)
“ ∧ ”按位异或运算符。
10级(左结合)
“ | ”按位或运算符。
11级(左结合)
“&&”逻辑与运算符。
12级(左结合)
“ || ”逻辑或运算符。
13级(右结合)
? :条件运算符。
14级(右结合)
=、 +=、 -=、 *=、 /=、 %=、 &=、 ^=、 |=、 <<=、 >>=赋值运算符。
15级(左结合)
“,”逗号运算符。
[pre]C 语言中,逗号(,)也可以是运算符,称为逗号运算符(Comma Operator)。逗号运算符可以把两个以上(包含两个)的表达式连接成一个表达式,称为逗号表达式。其一般形式为:
  子表达式1, 子表达式2, ..., 子表达式n
  例如:
  a + b, c = b, c++
  逗号运算符的优先级是所有运算符中级别最低的,通常配合 for 循环使用。逗号表达式最右边的子表达式的值即为逗号表达式的值。上例中,c++ 的值(c 自增之前的值)即为该表达式的值。
  逗号运算符保证左边的子表达式运算结束后才进行右边的子表达式的运算。也就是说,逗号运算符是一个序列点,其左边所有副作用都结束后,才对其右边的子表达式进行运算。因此,上例中,c 得到 b 的值后,才进行自增运算。
回复 使用道具 举报
wx_BZhrvVik 发表于 2015-5-4 18:52
#include  

int main()

感谢分析,分析得非常清楚:)
回复 使用道具 举报
#include <stdio.h>

int main()
{
    int i = 5, j = 9;//定义为整型
   
    float x = 2.3,  y = 45.;//定义为浮点型
   
    printf("%8.2f\n", i%(int)(x+y)*j/2/3+y);
//首先运算(int)(x+y)=47
// i%(int)(x+y),5%47,除法取余,因为5小于47,所以除法得0余5,余数为5
// i%(int)(x+y)*j  =5*9=45
// i%(int)(x+y)*j/2=45/2 因为是整型所以答案为22
//i%(int)(x+y)*j/2/3=22/3=7
//i%(int)(x+y)*j/2/3+y=7+45.     因为y为浮点型所以答案是52.00
    return 0;

}
回复 使用道具 举报
取余和除法概念完全不一样的,取余还要注意对象都必须是整数。这道题主要涉及到运算符优先级还有数据类型的强制转换等知识。
回复 使用道具 举报
通常都是要加括号吧。。。不然蛋疼
回复 使用道具 举报
变味的面包 来自手机 中级黑马 2015-5-4 08:23:06
10#
实在搞不懂优先级就加个括号吧
回复 使用道具 举报
龙瑞麟 发表于 2015-5-3 23:16
我明白了,一个数%比它大得数其结果等于它本身

没错,这里我也没搞清楚
回复 使用道具 举报
龙瑞麟 发表于 2015-5-3 16:24
5%(int)(47.5) ---> 5%47--->取得5除以47的余数...--->结果,不应该是(商0.1)余 3 么??怎么算出5的? ...

我明白了,一个数%比它大得数其结果等于它本身
回复 使用道具 举报
stein 发表于 2015-5-3 10:58
-0 -    5%(int)(47.5) ---> 5%47--->取得5除以47的余数...--->结果 5

5%(int)(47.5) ---> 5%47--->取得5除以47的余数...--->结果,不应该是(商0.1)余 3 么??怎么算出5的??
回复 使用道具 举报

取模与乘除谁的优先级更高啊
回复 使用道具 举报
龙瑞麟 发表于 2015-5-3 09:37
//1. 5%(int)(2.3+45) = 5
这一句我还是有点不明白啊

-0 -    5%(int)(47.5) ---> 5%47--->取得5除以47的余数...--->结果 5
回复 使用道具 举报
楼上正解
回复 使用道具 举报
//1. 5%(int)(2.3+45) = 5
这一句我还是有点不明白啊
回复 使用道具 举报
  1. #include <stdio.h>

  2. int main()
  3. {
  4.     int i = 5, j = 9;

  5.     float x = 2.3,  y = 45.;

  6.     printf("%8.2f\n", i%(int)(x+y)*j/2/3+y);
  7.     //%8.2f\n  -- 输出格式,按 float 定点格式,数据占8位(包括符号,小数点),小数部分两位。左边空位用空白填补
  8.     //结果 :空格空格空格52.00
  9.     return 0;
  10.     // 执行顺序 : 5 % (int)(2.3+45)*9/2/3 + 45
  11.     //1. 5%(int)(2.3+45) = 5
  12.     //2. 5*9/2/3 = 7
  13.     //3. 7 + 45 = 52
  14.     //4. 格式输出:空格空格空格52.00
  15. }
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马