考慮follwoing片段:就懷疑運營商
int a,b;
a = 1;
b = 2;
c = a++++b; // does not work!! Compilation error.
c = a++*+b; // works !!
請幫助我理解這種行爲。
考慮follwoing片段:就懷疑運營商
int a,b;
a = 1;
b = 2;
c = a++++b; // does not work!! Compilation error.
c = a++*+b; // works !!
請幫助我理解這種行爲。
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;
感謝codaddict的詳細解釋。無論何時,如果有人懷疑闖入運營商的分組,我會運用這個最大限度的咀嚼規則。 – Zacky112 2010-02-03 08:13:40
這是有效地,因爲「maximum munch rule」中C.
c = a++++b;
被解析爲c = a++ ++ b;
,這是語法錯誤。
c = a++*+b;
被解析爲c = a++ * +b;
,這沒問題。
從C99草案,部分6.4p4(重點煤礦):
如果輸入流被解析爲預處理標記到一個給定的字符,下一個預處理標記是字符最長序列這可能構成一個預處理令牌。
感謝Alok給予參考和解釋。 – Zacky112 2010-02-03 08:12:22
operator precedence。 ++比二進制+有更高的優先級。
++的優先級等於+的優先級。所以我們使用從左到右。
爲什麼我們在C++爲得到一個錯誤,一樣的道理:
vector<vector<int>>;
的>>
將作爲一個運營商來處理。
「不工作」無法模糊。它假定有一個表示「工作」的預期輸出,以及一個表示「不工作」的實際輸出,並且你也未能提供。 – 2010-02-03 08:00:45
有什麼意義? – Art 2010-02-03 08:00:55