为什么这个函数会输出它的数字?

时间:2012-02-23 05:36:29

标签: c

输出

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”,没有任何反应。如果我使用除测试以外的任何其他名称进行编译,则可以正常工是什么给了什么?

3 个答案:

答案 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)*ca/(b*c)

但是,turns out,语法本身(见上文)决定了这一点。因为语法陈述(部分):

multiplicative-expression:
    multiplicative-expression * cast-expression

a/b*c这样的表达式必须将c分配给cast-expressiona/b分配给multiplicative-expression,然后先对其进行评估。

因此,乘法运算符是左联结的,而且ISO的身体,以及某些SO身体再次证明自己比我更聪明: - )