我们如何解释expression式的结果(++ x)+(++ x)+(++ x)?

x = 1; std::cout << ((++x)+(++x)+(++x)); 

我预计输出是11 ,但实际上是12 。 为什么?

我们通过期待未定义的行为而不是任何特定的结果来解释它。 由于expression式尝试多次修改x而没有中间顺序点,所以它的行为是不确定的 。

正如其他人所说,C和C ++标准并没有定义这将产生的行为。

但是对于那些不明白为什么标准会做这样的事情的人,让我们来看一个“现实世界”的例子:

 1 * 2 + 3 + 4 * 5 

在计算4*5之前计算1 * 2 + 3是没有问题的。 仅仅因为乘法具有比加法更高的优先级并不意味着我们需要在执行任何加法之前执行expression式中的所有乘法。 实际上有很多不同的命令可以有效地执行你的计算。

在评估有副作用的地方,不同的评估指令会影响结果。 如果标准没有定义行为, 不要依赖它

这实际上是未定义的。 C ++没有明确地定义语句的执行顺序,所以它依赖于编译器,不应该使用这个语法。

代码片段将在C / C ++中调用未定义的行为 。从这里阅读序列点。

我的想法是

 cout<<((++x)+(++x)+(++x)); 

编译器首先运行前缀++ x,这样x的值就变成了

x = 2时


现在通过++ x,x会变成

X = 3


在++ x之后

X = 4


现在是时候添加x的值了

X + X + X = 4 + 4 + 4

X + X + X3 = 12