2016-07-29 91 views
-1

我得到錯誤的彙編代碼從C編譯器下面的測試代碼。 這是由於未定義的行爲?評估順序:未定義的行爲?或編譯器缺陷?

void SimulatedTest(void) 
{         
    if ((a) || (b && c || d) == 1) 
    { 
     i = 2; 
    } 
    else 
    { 
     i = 4; 
    } 
} 

什麼標準說:

6.5.16賦值運算符

操作數的評價的順序是不確定的。如果試圖 作出修改賦值運算符的結果,或者下一個序列點之後訪問它 ,行爲是不確定

C運算符優先級規則

  1. ()
  2. ==
  3. || & &

對於該問題的情況下:如果((A)||(B & &Ç|| d)== 1) Compiler將評估以下順序在表達和產生錯誤的代碼

1.(b & &ç|| d) - > R1

2.R1 == 1 - > R2

3.(A)|| R2

但是編譯器生成正確的代碼用於以下情況

案例1:。當沒有關係 '==' 操作

if ((a) || (b && c || d))//compiler generates expected code 

情況2:當括號中加入用於邏輯或運算

if (((a) || (b && c || d)) == 1)//compiler generates expected code 

情形3:操作之間沒有使用括號

if (a || b && c || d == 1)//compiler generates expected code 

想知道這個問題是否情況下,不確定的行爲屬於類或不。

問候,

的Mac

+1

關於您的_C運算符優先級rule_:'&&'的優先級高於'||',因此它們不必位於同一行上 – Garf365

+0

如果您想要,您似乎缺少一組圓括號得到你的'預期結果' – Shark

+0

尋求調試幫助的問題(「爲什麼不是這個代碼工作?」)必須包括所需的行爲,特定的問題或錯誤以及在問題本身中重現它所需的最短代碼。沒有明確問題陳述的問題對其他讀者無益。請參閱:如何創建最小,完整和可驗證示例。 – Olaf

回答

7

相等運算==具有比所述邏輯或運算符||更高的優先級。因此編譯器是正確的,沒有未定義的行爲。

的評價是相同的:

a || ((b && c || d) == 1) 
0

此:

if ((a) || (b && c || d) == 1) 

||的結果與一個整數,而決不是你想要做什麼比較。

規定的邏輯運算符的優先順序,這並不總是人們期望的那樣,它通常是最安全的括號內甩出去讓事情更清晰的讀取,從而

if ((a) || ((b && c) || d) == 1) 

if ((a) || (b && (c || d)) == 1) 

來處理&&||

並取決於你期望==與之比較(如果你真的要做到這一點,我懷疑)

if ((a) || ((b && c || d) == 1)) 

if (((a) || (b && c || d)) == 1) 

但編譯器編譯權。這對於人類心靈意味着什麼並不是非常明顯。