2010-02-03 64 views
6

考慮follwoing片段:就懷疑運營商

int a,b; 
a = 1; 
b = 2; 

c = a++++b; // does not work!! Compilation error. 
c = a++*+b; // works !! 

請幫助我理解這種行爲。

+4

「不工作」無法模糊。它假定有一個表示「工作」的預期輸出,以及一個表示「不工作」的實際輸出,並且你也未能提供。 – 2010-02-03 08:00:45

+6

有什麼意義? – Art 2010-02-03 08:00:55

回答

30
c = a++++b; 

被視爲:

c = ((a++)++)b; 

,你正試圖增加非左值這是不正確。

c = a++*+b; 

被視爲:

c = (a++)*(+b); 

針對此行爲的原因是:在C語言詞法分析器是greedy。在案例1中:詞法分析器'a'(標識符)之後,詞法分析器看到+,後跟另一個+,因此它將兩個(作爲增量運算符)作爲同一個標記的一部分使用。它不會使+++不是有效的標記,所以它不會成爲同一標記的第3 +部分。類似地集團在未來兩到+令牌++使其有效地一樣:

c = ((a++)++)b; 

爲++不會返回一個左值這是不正確的,因此你不能將其應用A ++。類似於說5 ++的東西;

但在情況2中:第一對++將組合在一起(作爲增量運算符)。接下來,*本身就是一個令牌,因爲你無法將它與+結合起來,因爲* +不是有效的令牌。最後,+將令牌(作爲一元+),有效地使你的語句:

c = (a++)*(+b); 

您可以通過使用括號或空格的如下重寫詞法分析器的這種貪婪行爲:

c = a++ + +b; 
c = a++ * +b; 
+1

感謝codaddict的詳細解釋。無論何時,如果有人懷疑闖入運營商的分組,我會運用這個最大限度的咀嚼規則。 – Zacky112 2010-02-03 08:13:40

7

這是有效地,因爲「maximum munch rule」中C.

c = a++++b; 

被解析爲c = a++ ++ b;,這是語法錯誤。

c = a++*+b; 

被解析爲c = a++ * +b;,這沒問題。

從C99草案,部分6.4p4(重點煤礦):

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

+0

感謝Alok給予參考和解釋。 – Zacky112 2010-02-03 08:12:22

0

operator precedence。 ++比二進制+有更高的優先級。

+2

我不明白它可能是運營商的優先級。 – 2010-02-03 08:08:08

+0

c = a ++ ++ b;是好的,但如果你刪除空白,那麼事實證明是一個無效的左值錯誤。 – bhups 2010-02-03 08:43:18

+0

我想我誤解了這個問題。感謝您的解釋。 – bhups 2010-02-03 12:01:59

0

++的優先級等於+的優先級。所以我們使用從左到右。

1

爲什麼我們在C++爲得到一個錯誤,一樣的道理:

vector<vector<int>>; 

>>將作爲一個運營商來處理。