2014-10-07 67 views
6
#include <stdio.h> 

int main(void) 
{ 
    int a = 1, i = 3, x, y, z; 
    a = 1; i = 3; 
    x = a+++i; 
    a = 1; i = 3; 
    y = a++ + i; 
    a = 1; i = 3; 
    z = a + ++i; 
    printf("%d %d %d", x, y, z); 
    scanf(" "); 
    return 0; 
}  

此代碼輸出似乎爲4 4 5。但爲什麼a+++i等於a++ + iC中的「a +++ i」等於「(a ++)+ i」

是不是因爲編譯器總是從左到右閱讀源代碼?

還是因爲操作遵循the order of precedence

它會在所有的編譯器上都一樣嗎?

+0

與[爲什麼不在+++++ b中工作在C?](http://stackoverflow.com/q/5341202/1708801) – 2014-10-17 17:50:51

回答

5

C11標準,部分6.4 (Lexical elements)/4說(和C99這是相同的):

如果輸入流已被解析成預處理標記到一個給定的字符,該 下一個預處理標記是最長的序列可能構成預處理令牌的字符。

還有有一個例子:

程序片段x+++++y被解析爲x ++ ++ + y,違反了在 增量運營商的約束,即使解析x ++ + ++ y可能產生一個正確的表達。

1

我不能說全部,因爲C編譯器的實現可能會不同。但通常是的,你是對的。 C編譯器應該是貪婪的,即儘可能多地讀取,因此+++ == ++ +

+0

在C++中找不到模板嗎? – 2014-10-07 12:32:17

+0

啊,你是對的! – Vin 2014-10-07 13:33:50

相關問題