后缀和前缀增量

时间:2013-05-27 00:01:44

标签: 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等于2而不是零,这意味着首先评估cout的整体i++ 然后打印(不是部分)。如果是这样,那么第一个值应该是1,而不是2,因为i应该在打印后增加2 2 0。你能澄清一下吗?

编辑:

下一个代码的输出为#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; }

{{1}}

为什么?

3 个答案:

答案 0 :(得分:3)

您的代码输出中没有任何意义上的推理,因为它代表您的程序显示未定义的行为。

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

  

在运算符的结果的值计算之前,对运算符的操作数的值计算进行排序。如果标量对象上的副作用相对于同一标量对象上的另一个副作用或使用相同标量对象的值进行值计算未被排序,则行为未定义。

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


如果您将语句分开,结果将按预期显示:

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

答案 1 :(得分:-2)

评估从右到左。

i = 0

++ i - &gt; i = 1

i ++ - &gt; i = 1,增加后,发生复制。那么i = 2

i - &gt; i = 2

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

答案 2 :(得分:-2)

如果我不明白你的问题,请告诉我:

cout << i++;

相当于

cout << i;
i+=1;

cout << ++i

相当于

i += 1;
cout << i; 

换句话说,在任何时候使用i++,后递增它会返回当前值然后更改,而++i表示先递增然后返回新值。它与cout

无关