0

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

因为 firsti等于 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;
}

为什么?

4

3 回答 3

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
于 2013-05-27T00:18:31.443 回答
-2

评估从右到左。

我 = 0

++i -> i = 1

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

我 -> 我 = 2

由于这一切都是在发送到 cout 之前发生的,所以 i 的值为 2,而中间的 i 已被复制,其值为 1。

于 2013-05-27T00:07:53.790 回答
-2

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

cout << i++;

相当于

cout << i;
i+=1;

尽管cout << ++i

相当于

i += 1;
cout << i; 

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

于 2013-05-27T00:10:37.320 回答