扭曲的C ++代码


Twisted C++ code

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Undefined behavior and sequence points

1
2
3
4
5
6
7
8
 #include< iostream.h>
 int main()
 {
       int i=7,j=i;
       j=(i++,++i,j++*i);
       cout <<j;
       return 0;
 }

C++代码的输出将是什么?

教授给我的作业。


有时,用几个编译器实际编译程序并观察结果有助于说服那些不相信这是未定义的人:

修正了iostream.h错误后,

  • G++4.5.2打印64
  • Clang++2.8打印63
  • Sun C++ 5.8打印63
  • MSVC 2010打印64

(噢,而且,重新编写以使用C I/O,Unix7上的原始K&R C编译器打印63)


[编辑以解释OP的问题更改编辑]:

输出是什么还没有定义。


代码中存在以下错误:

#include 应为#include

j未初始化,因此j++*i的值未知-好,这在编辑中得到修复,

另外,任务本身是不恰当的。卷积线可重写为:

1
2
3
i++;
++i;
j = j++ * i;

最后一部分因以下原因无效:

未定义的行为和序列点


本质上,你是把i乘以2,乘以j的初始值,再加上1。

最后,j=64

1
j = ((7+2)*7) + 1 = (9*7)+1 = 63+1 = 64

至少这是我的Visual Studio 2010编译器所做的。