2013-05-16 41 views
0

我知道這樣(到位分號的逗號)的聲明看起來很奇怪:爲什麼逗號運算符似乎在我的代碼中的「if」語句和「else」語句之間工作?

if(a<b)printf("Hello\n"),a+=5,b/=5,printf("%d,%d",a,b); 

但它運行完美,我讀過那是因爲這裏comma作爲一個序列point.I能瞭解this.But我只是不明白爲什麼那麼下面失敗了,在那裏我已經使用了一個else還有:

if(a<b)printf("Hi\n"),else printf("Bye\n"),a+=5,b/=5,printf("%d,%d",a,b); 

它給人的錯誤expected expression before 'else'

爲什麼第二條語句提示錯誤?在第一條語句中,我們看到comma充當序列point.Then爲什麼它不else之前採取行動呢?有什麼特別,導致錯誤的第二種情況?這是我的完整的程序:

#include<stdio.h> 

int main(void) 
{ 
    int a=30,b=45; 

    //if(a<b)printf("Hello\n"),a+=5,b/=5,printf("%d,%d",a,b); //Works well 
    if(a<b)printf("Hi\n"),else printf("Bye\n"),a+=5,b/=5,printf("%d,%d",a,b); 

} 
+0

http://stackoverflow.com/questions/16262983/are-there-sequence-point-issues-with-statements-like-int-a-4-ptr-a-or-x –

+2

忘記一切Python(或任何其他非C/C++語言)曾經教過你關於逗號的問題,這是一個**運算符**在C和C++中。 – WhozCraig

+0

@WhozCraig那麼,程序會出現/評估逗號左側的所有內容,並返回最後一個逗號後面的內容。但這對上面的'else'不公平。 –

回答

5

逗號運算符期望表達式和ifelse構造的else部分不是表達式。因此,後跟關鍵字else的逗號是語法錯誤。

+0

+1這很簡單,因爲這看起來很對,恕我直言。 if部分的陳述結局從未結束,並且逗號鏈以** else **開頭,因此無效。好的答案,先生。 – WhozCraig

+0

這也許有用:http://stackoverflow.com/questions/19132/expression-versus-statement/19224#19224 – Spook

3

試想一下,即:

(a, b) 

被翻譯成:

{ 
    a; 
    return here b; 
} 

在這種情況下,return here表示「插入代替此表達式」。實際上,,充當序列點。

然後,

if (a<b) printf("Hello\n"), a+=5, b/=5, printf("%d,%d",a,b); 

會是什麼樣子:

if (a<b) 
{ 
    printf("Hello\n"); 
    a += 5; 
    b /= 5; 
    return here printf("%d, %d", a, b); 
} 

if(a<b)printf("Hi\n"),else printf("Bye\n"),a+=5,b/=5,printf("%d,%d",a,b); 

會是什麼樣子:

if (a < b) 
{ 
    printf("Hi\n"); 
    else printf("Bye\n"); 
    a += 5; 
    b /= 5; 
    return here printf("%d, %d", a, b); 
} 

而其他內部沒有任何意義。這就是編譯器投訴的原因。

換句話說,C++中的,是一個運算符。因此,通過運算符優先級,

if(a<b)printf("Hi\n"),else printf("Bye\n"),a+=5,b/=5,printf("%d,%d",a,b); 

被解釋爲

if(a<b) (printf("Hi\n"),else printf("Bye\n"),a+=5,b/=5,printf("%d,%d",a,b)); 

其中明確違反了C++的語法規則。

+0

不錯的答案。謝謝。 –

0

看看IF-ELSE語句的正確語法。編譯器希望分號知道IF已結束。所以你基本上試圖輸入sub if-else語句到第一個,但沒有新的if。

if(a>=18 &a <=64)printf("adult\n"); 
else if(a<=17)printf("minor\n"); 
else printf("senior\n"); 

所以,無論是大括號「{}」表示IF區域,或者如果他們丟失了,IF語句有效,直到第一個分號。

0

在第二種情況其他不具有匹配如果,這裏發生了什麼是printf的後(「嗨,\ n」),當別人到達編譯器查找,如果即別人要來只有終止後的if語句。所以它給錯誤。