2012-02-23 42 views
1

OUTPUT为什么这个函数输出它所做的数字?

Fun1 is not fun 
9 

CODE

#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); 
} 

QUESTION

为什么它输出9从45%54/5?这不会输出2吗?我能看到这个9的唯一方法是跳过%(模数除法运算符,对吧?),然后将5除以54,但这对我来说没有意义。

编辑:随机继发性问题。如果我命名我的文件test.c,用cc test.c -o test进行编译,然后输入“test”,则什么都不会发生。如果我使用除测试以外的任何其他名称编译,它都可以正常工作是什么赋予了?

+1

查找相关的运算符优先级。这个例子真的需要很长时间吗,只是问怎么评估45%54/5? – 2012-02-23 05:39:08

+1

为什么会输出2? – alex 2012-02-23 05:40:34

+1

关于你的第二个问题:你必须使用'。/ test',而不是'test'。测试是[unix命令](http://en.wikipedia.org/wiki/Test_%28Unix%29)。 – Zeta 2012-02-23 05:45:38

回答

3
45 % 54/5 

(45 % 54)/5 

,其评价为:

45 % 54 = 45 
45/5 = 9 

45 MOD 54等于45,我不看你怎么指望拿到2不管你如何点餐。

+0

谢谢,为什么呢? 54进入45 0次,所以不会有剩余,它不会只是0吗? – eveo 2012-02-23 05:41:00

+2

你正混淆商与余数/模数。 '54'进入'45'' 0'次,其余的'45'。 – Mysticial 2012-02-23 05:42:12

+0

@soju如果它进入0次,那么剩下的就是一切。 – RussS 2012-02-23 05:43:31

3

模数运算符与除法运算符具有相同的优先级,所以按照从左到右的顺序执行操作,这意味着首先执行模数。

45 % 54 = 45 

然后

45/5 = 9 

这将是一个更容易发现,如果45/5和45%的54个不相等的,但这里的数字似乎巧合。

+0

它们具有相同的优先级...并且mod由于它们是左关联而被首先绑定... – 2012-02-23 05:41:02

+0

它们不具有*相同*优先级吗? – alex 2012-02-23 05:41:16

+0

没错,我错误地说只是因为它首先从左到右出现。定影。 – 2012-02-23 05:41:54

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

因为他们是在同一个大节,他们的优先级相同,他们是左结合(一) ,所以表达式:

45 % 54/5 

有效的是:

(45 % 54)/5 
= (45)/5   # 45/54 is 0, with a remainder of 45 
= 9 

这就是为什么你会得到你的答案9


(一)在一个侧面说明,我想我找到了C标准的孔,因为我能找到无关的操作符的结合(左或右),是否a/b*c将评估为(a/b)*ca/(b*c)

但是,它turns out,语法本身(见上文)规定了这一点。因为语法状态(部分地):

multiplicative-expression: 
    multiplicative-expression * cast-expression 

a/b*c的表达将不得不分配ccast-expressiona/bmultiplicative-expression,第一评估它。

因此乘法运算符是左结合和ISO的BOD,和某些SO的BOD为好,再一次证明了自己的聪明,比我:-)