输出
Fun1 is not fun
9
代码
#include <stdio.h>
int fun1(void){
printf("Fun1 is not fun\n");
return 45%54/5;
}
main()
{
int c;
c=fun1();
printf("%d\n", c);
}
问题
为什么从45%54/5输出9?这不会输出2吗?我只能看到这个为9的唯一方法是跳过%,(模数除法运算符,对吗?)然后除以5,完全省略54,但这对我没有意义。
编辑:随机的二级问题。如果我将我的文件命名为test.c,用cc test.c -o test
编译它,然后键入“test”,没有任何反应。如果我使用除测试以外的任何其他名称进行编译,则可以正常工是什么给了什么?
答案 0 :(得分:3)
45 % 54 / 5
是
(45 % 54) / 5
评估为:
45 % 54 = 45
45 / 5 = 9
45 mod 54等于45.无论你如何订购,我都不会看到你如何获得2。
答案 1 :(得分:3)
模数运算符与除法运算符具有相同的优先级,因此操作按从左到右的顺序执行,这意味着首先执行模数。
45 % 54 = 45
然后
45 / 5 = 9
如果45/5和45%54不相等,这将更容易发现,但这里的数字似乎是巧合。
答案 2 :(得分:1)
C99标准可以说明C99 6.5 Expressions /3 footnote 74
)中的运算符优先级:
语法指定运算符在表达式求值中的优先级,与本子条款的主要子条款的顺序相同,优先级最高。
稍后,我们看到乘法运算符被集中在一起:
6.5.5乘法运算符
语法的
multiplicative-expression:
cast-expression
multiplicative-expression * cast-expression
multiplicative-expression / cast-expression
multiplicative-expression % cast-expression
因为它们在同一个主要部分,它们的优先级相同,而且它们是左关联的(a),所以表达式为:
45 % 54 / 5
实际上是:
(45 % 54) / 5
= (45) / 5 # 45 / 54 is 0, with a remainder of 45
= 9
这就是为什么你得到9
的答案。
(a)在旁注中,我以为我在C标准中找到了一个洞,因为我无法找到那些操作员的关联性(左或右),无论是a/b*c
评估为(a/b)*c
或a/(b*c)
。
但是,turns out,语法本身(见上文)决定了这一点。因为语法陈述(部分):
multiplicative-expression:
multiplicative-expression * cast-expression
像a/b*c
这样的表达式必须将c
分配给cast-expression
,a/b
分配给multiplicative-expression
,然后先对其进行评估。
因此,乘法运算符是左联结的,而且ISO的身体,以及某些SO身体再次证明自己比我更聪明: - )