以下程序的意外输出

unexpected output of the following program

本文关键字:意外 输出 程序      更新时间:2023-10-16
#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 611,为什么不 6 6 6 12 请指导执行步骤。 在这里,我的疑问是 **p 仅指向 x,它由第二个操作数 ++(**p( 递增。所以 y 的值应该是 12。

这是典型的未定义行为C++标准中无法保证y=**p + ++(**p)+运算符操作数的计算顺序。

我在MSVCclang-cl中测试了您的代码,并得到了输出:6 6 6 12- 这表明(如您所料(首先评估++(**p)。但是,在您的编译器上,似乎首先评估 LHS。

来自Scheff评论中链接的 cppreference 网站:

任何表达式的任何部分的求值顺序,包括 函数参数的计算未指定(有一些例外 下面列出(。编译器可以计算操作数和其他 子表达式按任意顺序排列,并且可以在 再次计算相同的表达式。 没有概念 从左到右或从右到左的评估C++....

PS:有趣的是,更改为y = ++(**p) + **p;也会6 6 6 12作为输出。