后缀和前缀自增

Postfix and prefix increment

本文关键字:前缀 后缀      更新时间:2023-10-16

为什么下一段代码的输出是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的整个类然后打印出来(不是一部分一部分地)。如果是这样,那么第一个值应该是1,而不是2,因为i++应该在打印后增加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;
}

为什么?

在你的代码输出中没有意义的推理,因为你的程序表现出未定义行为。

c++ 11标准第1.9/15段:

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

由于没有序列点将i的两个突变分开,因此发生未定义行为。你的编译器可能不输出任何东西,程序在不同的编译器上可能输出不同的结果。但是在这种情况下争论输出是不必要的。


如果你把语句分开,结果就会如预期的那样出来:

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

从右到左求值

i = 0

++i -> i = 1

i++ -> i = 1,递增后,复制发生。则I = 2

i -> i = 2

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

如果我没有理解清楚你的问题,请告诉我:

cout << i++;

相当于

cout << i;
i+=1;

while cout << ++i

相当于

i += 1;
cout << i; 

换句话说,任何时候你使用i++,后增量它返回当前值,然后改变,而++i意味着先增量,然后返回新值。它与cout

无关