以下程序的意外输出
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 611,为什么不 6 6 6 12 请指导执行步骤。 在这里,我的疑问是 **p 仅指向 x,它由第二个操作数 ++(**p( 递增。所以 y 的值应该是 12。
这是典型的未定义行为!C++
标准中无法保证y=**p + ++(**p)
中+
运算符操作数的计算顺序。
我在MSVC
和clang-cl
中测试了您的代码,并得到了输出:6 6 6 12
- 这表明(如您所料(首先评估++(**p)
。但是,在您的编译器上,似乎首先评估 LHS。
来自Scheff评论中链接的 cppreference 网站:
任何表达式的任何部分的求值顺序,包括 函数参数的计算未指定(有一些例外 下面列出(。编译器可以计算操作数和其他 子表达式按任意顺序排列,并且可以在 再次计算相同的表达式。 没有概念 从左到右或从右到左的评估C++....
PS:有趣的是,更改为y = ++(**p) + **p;
也会6 6 6 12
作为输出。
相关文章:
- 字符串比较中的意外输出
- 来自 decltype 的意外输出类型
- 字符数组到十六进制字符串的转换 - 意外输出
- 使用 boost::regex 从目录中获取带有一些正则表达式的文件名称时出现意外输出
- 使用后序遍历递归的深度优先搜索会产生意外输出
- C++的意外输出
- 贝金纳C++练习解决方案的意外输出
- 无效* 转换获得意外输出
- 以下程序的意外输出
- 意外输出:矢量矢量(功率集)
- 基本 int 数组提供意外输出
- 线程的意外输出
- 减法中的意外输出
- 带有左移操作员C 的意外输出
- C strncpy意外输出
- 意外输出..函数绑定在虚拟表中的发生方式
- 星号的意外输出
- 已编译的 protobuf 文件的意外输出路径
- 打印对象矢量的意外输出
- 递归函数用于计算 n 个数字之和的意外输出