int x = 15 ;
printf ("\n%d \t %d \t %d", x != 15, x = 20, x < 30) ;
代碼的輸出是1 20 1,但我認爲它應該是0 20 1自15 == 15 ...!= C語言符號查詢
我面臨同一個問題「x!= 15」部分
int x = 15 ;
printf ("\n%d \t %d \t %d", x != 15, x = 20, x < 30) ;
代碼的輸出是1 20 1,但我認爲它應該是0 20 1自15 == 15 ...!= C語言符號查詢
我面臨同一個問題「x!= 15」部分
根據我的經驗,大多數參數列表在大多數C/C++編譯器下從右向左進行處理,即使規範沒有聲明需要的評估順序爲。
隨着許多編譯器是如何工作的這樣的理解,你的參數列表會像這樣
printf ("\n%d \t %d \t %d", x != 15, x = 20, x < 30) ;
評估板(可能)在
x < 30 => 1
x = 20 (assigns x to 20, returning 20) => 20
x != 15 => 1 (because x is now 20)
如果本次評估的順序進行評估順序適用於您的編譯器,然後重新排列參數,如
printf ("\n%d \t %d \t %d", x < 30, x = 20, x != 15) ;
應該一代產量
1 20 0
因爲之前x
被重新分配到20
這個練習的教訓是要儘量避免使用列表構造分配(東西看起來像「A,B將出現比較x != 15
,c,d「)或至少不能讀取同一個列表結構中的賦值變量,因爲不能保證從右到左或從左到右的評估(與編譯器相關)。
說句不明白,行爲是* undefined *,結果*會因編譯器而異。 –
@JohnBode我以爲我明確表達了這一點,但大多數使用LR類型解析器實現的編譯器會導致從右到左列表處理的高效(因此是選擇的)權利。如果不清楚評估順序不能保證,那麼謝謝你讓它更加明顯。 –
您的代碼遭受未指定的行爲:執行表達式的順序不是由標準強制執行的,從左到右。 試試這個代替
int x = 15 ;
int result1 = (x != 15);
int result2 = (x = 20);
int result3 = (x < 30);
printf ("\n%d \t %d \t %d", result1, result2, result3) ;
它應該是x == 20而不是x = 20。這導致你的x變量從15變化,實際上使這個答案有意義。 –
你對'printf'的第三個參數是'x = 20',它將'x'賦值爲20.C不能保證參數被評估的順序,所以'x = 20'可以在'x!= 15'。 – vcsjones