C++ 后缀和前缀增量

C++ 后缀和前缀增量,c++,C++,为什么下一个代码的输出是2 1 2 #include "iostream" int main(int argc, const char *argv[]) { int i = 0; std::cout << i << std::endl << i++ << std::endl << ++i << std::endl; return 0; } 为什么?评估从右向左 i=0 ++i->i=1 i++->i=1,增量后

为什么下一个代码的输出是
2 1 2

#include "iostream"
int main(int argc, const char *argv[])
{
  int i = 0;
  std::cout << i << std::endl << i++ << std::endl << ++i << std::endl;
  return 0;
}

为什么?

评估从右向左

i=0

++i->i=1

i++->i=1,增量后,发生复制。那么i=2

i->i=2


由于所有这些都是在发送到cout之前发生的,因此i的值为2,中间的值已被复制,其值为1。

如果我不清楚您的问题,请告诉我:


cout在代码的输出中没有合理的推理,因为在当前情况下,程序表现出未定义的行为

根据C++11标准第1.9/15段:

运算符操作数的值计算在运算符结果的值计算之前排序。如果标量对象上的一个侧面效应相对于同一标量对象上的另一个侧面效应或使用同一标量对象的值计算的值未排序,则该行为是不确定的

因为没有序列点将
i
的两个突变分开,因此会出现未定义的行为。您的编译器可能不会输出任何内容,并且程序可能会在不同的编译器上输出不同的内容。但在这种情况下,争论输出是不必要的


如果将这些语句分开,结果将如预期的那样出现:

std::cout << i   << std::endl;  // 0
std::cout << i++ << std::endl;  // 0
std::cout << ++i << std::endl;  // 2

那么,对于完全相同的代码,如何解释这种不同的输出呢<代码>2 1 2
,i值为2,但中间的值由于后期增量而被复制,请单击我提供的链接。在这种情况下,输出是
0 0 2
,但我使用了完全相同的代码。它显然是特定于编译器的:)请看我的答案,它是相同的raeson:I=0。增量后,复制i,然后再进行增量。它是1,然后是++i,i=2,然后是i,仍然是2。i的值为2,除了第一个由于后增量而被复制的值。第二个注释应为0,而不是1,否?我没有投反对票,但您的答案是错误的,请参见。您的答案被否决可能是因为您未能解决问题。也就是说,除非您能够解释如何扩展等价性演示以应用于OP的示例:
std::cout
cout << i;
i+=1;
i += 1;
cout << i; 
std::cout << i   << std::endl;  // 0
std::cout << i++ << std::endl;  // 0
std::cout << ++i << std::endl;  // 2