[英]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)
+
運算符的操作數的求值順序。
我在MSVC
和clang-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.