[英]Unexpected output after running this little bit strange c code. Can anyone explain how this happened?
我試圖了解這段代碼是如何工作的,
int main () {
int m, k;
m = (k=5)+(k=8)+(k=9)+(k=7);
printf("m=%d\n",m);
printf("k=%d\n",k);
}
輸出:m=32 k=7
我不知道 m 的值是如何變成 32 的。我希望有人能幫助我理解這段代碼是如何工作的,以及輸出是如何結束的
簡化解釋:
當您在同一個表達式中多次使用k=...
時,對同一個變量的所有賦值都是所謂的“未排序的副作用”。 簡單地說,這意味着 C 沒有指定+
的哪個操作數首先評估/執行,也沒有指定執行分配的順序。
所以編譯器無法知道首先評估/分配哪個k
,因此會感到困惑。 這就是所謂的“未定義行為”,任何事情都有可能發生。
您必須通過將表達式分成幾個來解決這個問題,每個都用分號分隔,分號充當“序列點”,這意味着所有先前的評估都需要在;
遇到。 例子:
k=5;
k+=8;
k+=9;
m = k + 7;
這里有標准參考的詳細解釋:為什么我們不能將像 i++ 這樣的增量運算符與其他運算符混合使用?
這是未定義的行為。 您的編譯器對此發出警告
警告:對“k”的多個未排序的修改 [-Wunsequenced]
您可以在此處了解更多信息:
程序的行為是未定義的。
表達式中的k
上有多個未排序的寫入
(k = 5) + (k = 8) + (k = 9) + (k = 7)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.