黑马程序员技术交流社区

标题: 请大神帮忙分析一下这道题运行的结果,我没搞明白 [打印本页]

作者: 龙瑞麟    时间: 2015-5-3 01:21
标题: 请大神帮忙分析一下这道题运行的结果,我没搞明白
本帖最后由 龙瑞麟 于 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. }
复制代码







作者: stein    时间: 2015-5-3 05:38
  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. }
复制代码

作者: 龙瑞麟    时间: 2015-5-3 09:37
//1. 5%(int)(2.3+45) = 5
这一句我还是有点不明白啊
作者: LLLX77    时间: 2015-5-3 10:05
楼上正解
作者: stein    时间: 2015-5-3 10:58
龙瑞麟 发表于 2015-5-3 09:37
//1. 5%(int)(2.3+45) = 5
这一句我还是有点不明白啊

-0 -    5%(int)(47.5) ---> 5%47--->取得5除以47的余数...--->结果 5
作者: shenxian88    时间: 2015-5-3 16:18
stein 发表于 2015-5-3 05:38

取模与乘除谁的优先级更高啊
作者: 龙瑞麟    时间: 2015-5-3 16:24
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 23:16
龙瑞麟 发表于 2015-5-3 16:24
5%(int)(47.5) ---> 5%47--->取得5除以47的余数...--->结果,不应该是(商0.1)余 3 么??怎么算出5的? ...

我明白了,一个数%比它大得数其结果等于它本身
作者: pangang    时间: 2015-5-4 01:19
龙瑞麟 发表于 2015-5-3 23:16
我明白了,一个数%比它大得数其结果等于它本身

没错,这里我也没搞清楚
作者: 变味的面包    时间: 2015-5-4 08:23
实在搞不懂优先级就加个括号吧
作者: ruihai    时间: 2015-5-4 10:32
通常都是要加括号吧。。。不然蛋疼
作者: HHE_johnson    时间: 2015-5-4 12:29
取余和除法概念完全不一样的,取余还要注意对象都必须是整数。这道题主要涉及到运算符优先级还有数据类型的强制转换等知识。
作者: wx_BZhrvVik    时间: 2015-5-4 18:52
#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-5 09:31
wx_BZhrvVik 发表于 2015-5-4 18:52
#include  

int main()

感谢分析,分析得非常清楚:)
作者: roblonely    时间: 2015-5-5 09:52
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 的值后,才进行自增运算。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2