我得到錯誤的彙編代碼從C編譯器下面的測試代碼。 這是由於未定義的行爲?評估順序:未定義的行爲?或編譯器缺陷?
void SimulatedTest(void)
{
if ((a) || (b && c || d) == 1)
{
i = 2;
}
else
{
i = 4;
}
}
什麼標準說:
6.5.16賦值運算符
操作數的評價的順序是不確定的。如果試圖 作出修改賦值運算符的結果,或者下一個序列點之後訪問它 ,行爲是不確定
C運算符優先級規則
- ()
- ==
- || & &
對於該問題的情況下:如果((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
關於您的_C運算符優先級rule_:'&&'的優先級高於'||',因此它們不必位於同一行上 – Garf365
如果您想要,您似乎缺少一組圓括號得到你的'預期結果' – Shark
尋求調試幫助的問題(「爲什麼不是這個代碼工作?」)必須包括所需的行爲,特定的問題或錯誤以及在問題本身中重現它所需的最短代碼。沒有明確問題陳述的問題對其他讀者無益。請參閱:如何創建最小,完整和可驗證示例。 – Olaf