簡體   English   中英

運行這個有點奇怪的 c 代碼后出現意外的 output。 誰能解釋這是怎么發生的?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM