簡體   English   中英

在C中使用增量運算符

[英]Working of increment operator in C

#include <stdio.h>
void main()
{
int x=5,y=6;
printf("%d%d%d",x++,(y=x++),(x=y++));
}

任何人都可以解釋為什么這會返回766?

首先,如果這個問題以初學者C編程課程的形式提供,那么課程/教師就是一個糟糕的課程。

這里的主要問題是'x'和'y'在序列點之前被修改了幾次,這是未定義的行為(C99 / C116.5§2)。 這是一個嚴重的錯誤,因為任何事情都可能發生。 在刪除++ mess之前,沒有人知道這段代碼是做什么的。 閱讀本文然后再讀一遍

此外,函數參數的評估順序是未指定的行為。 (C99 / C116.5.2.2§10)。 也就是說,編譯器可以從左到右或從右到左對它們進行評估,我們無法知道適用的順序。 編譯器不需要記錄這個! 但如果你很幸運,可以記錄下來。 在嘗試回答問題之前,您必須閱讀編譯器文檔以了解適用的評估順序。 否則你必須給出兩個答案。

此外,如果這是托管系統的代碼,例如Windows PC,則只允許main返回'int',否則此代碼將無法在C編譯器上編譯。

你通過在序列點之間多次修改x來調用未定義的行為,所以你很幸運/不幸的是它打印了任何東西......

是的,未定義對這樣的函數的爭論的解釋順序是什么。

處理可變數量的args函數(如printf)的最簡單方法是從最后開始,因為你知道開始的位置!

正如'R'所指出的那樣 - 在評估不明確的情況下有一個陳述是不明確的。 例如x++ = x++

這個工作堆棧概念作為提及操作LIFO第一個右操作數進入堆棧,即x = y ++(這是后增量opratore然后第一個y值,在y之后將x增加為x = 6)然后secound(這里是x = 6且y = 7但是y指定x的值為6然后x將增加1)和第三(此處x = 7並且在此聲明之后x將增加1),值為766。

它首先計算最后一個表達式(x=y++) 這將返回6,因為x被賦值為y,最初為6,然后將y遞增為1.現在y為7,x為6. x在此處打印。

下一個要評估的表達式是(y=x++) 與上面相同,首先指定y = x並將x增加到1.因此,值為y為6,x為7. y在此處打印。

現在是x++ 它打印7並將x遞增到1。

執行strts frm從右到左。所以,x = y ++,x值變為6,之后y值變為7,然后是y = x ++,其中y的restoe值為6.之后在x ++語句中x值為7,因為先前的陳述(y = x ++)。答案766也是如此

printf("%d%d%d",x++,(y=x++),(x=y++)); 

想要添加為什么它從右端評估為前面提到的答案。 printf的所有參數都被推送到堆棧然后開始評估。 由於堆棧是LIFO,評估從結束開始。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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