2012-06-07 120 views
3
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」部分

+1

它應該是x == 20而不是x = 20。這導致你的x變量從15變化,實際上使這個答案有意義。 –

+1

你對'printf'的第三個參數是'x = 20',它將'x'賦值爲20.C不能保證參數被評估的順序,所以'x = 20'可以在'x!= 15'。 – vcsjones

回答

5

根據我的經驗,大多數參數列表在大多數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「)或至少不能讀取同一個列表結構中的賦值變量,因爲不能保證從右到左或從左到右的評估(與編譯器相關)。

+0

說句不明白,行爲是* undefined *,結果*會因編譯器而異。 –

+0

@JohnBode我以爲我明確表達了這一點,但大多數使用LR類型解析器實現的編譯器會導致從右到左列表處理的高效(因此是選擇的)權利。如果不清楚評估順序不能保證,那麼謝謝你讓它更加明顯。 –

7

您正在爲x分配一個新值,x = 20

您不能在參數列表中將這些操作假定爲函數調用的任何特定順序。

+0

我不認爲他打算這麼做。他看起來並不像他對輸出中的20人感到驚訝。我認爲他只是感到驚訝,在分配後評估了'x!= 15'。 – sepp2k

+0

@ sepp2k所以,我更仔細地閱讀了問題和期望的輸出,並編輯了我的答案。謝謝。 – pb2q

0

您的代碼遭受未指定的行爲:執行表達式的順序不是由標準強制執行的,從左到右。 試試這個代替

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) ;