2012-02-23 79 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爲好,再一次證明了自己的聰明,比我:-)