簡體   English   中英

以下程序的意外輸出

[英]unexpected output of the following program

#include<iostream>
#include<conio.h>
using namespace std;
int main()
{

     int y,**p,*pt;
     int x=5;
     pt=&x;
     p=&pt;
     y=**p + ++(**p);
     cout<<*pt<<" "<<**p<<" "<<x<<" "<<y;
     getch();
     return(0);
}

輸出生成的6 6 6 11,為什么不是6 6 6 12請在執行步驟中進行指導。 在這里,我的疑問是** p僅指向x,第二個操作數++(** p)將其遞增。 因此y的值應為12。

這是經典的未定義行為 C++標准中,不能保證y=**p + ++(**p) +運算符的操作數的求值順序。

我在MSVCclang-cl測試了您的代碼,然后得到了輸出: 6 6 6 12這表明(如您所願)首先對++(**p)進行了評估。 但是,在您的編譯器上,似乎首先評估了LHS。

從ceffreference網站鏈接到Scheff的評論中:

未指定任何表達式的任何部分的評估順序,包括函數參數的評估順序(以下列出了一些例外)。 編譯器可以按任何順序求值操作數和其他子表達式,並且在再次求同一個表達式時可以選擇其他順序。 在C ++中沒有從左到右或從右到左求值的概念。

PS:有趣的是,更改為y = ++(**p) + **p; 還給出6 6 6 12作為輸出。

暫無
暫無

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

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