前/后增量说明

时间:2012-01-19 20:03:48

标签: c++ post-increment pre-increment

请对我很轻松,不要拍我,因为我还是新手。

我完全糊涂了,不能终身弄清楚为什么我运行这段代码时:

int y = 9;
cout << "++y = " << ++y << "\n--y = " << --y << "\ny++ = " << y++ << "\ny-- = " << y-- << "\n";
cout << "y = " << y << "\n";

我得到以下结果:

y = 9
++y = 9
--y = 9
y++ = 8
y-- = 9
y = 9

而不是这些结果:

y = 9
++y = 10
--y = 9
y++ = 9
y-- = 10
y = 9

我从这段代码中得到:

int y = 9;
cout << "y = " << y << "\n";
cout << "++y = " << ++y << "\n";
cout << "--y = " << --y << "\n";
cout << "y++ = " << y++ << "\n";
cout << "y-- = " << y-- << "\n";
cout << "y = " << y << "\n";

任何人都可以解释 - 尽可能简单的单词 - 第一个代码会发生什么,以便以这种方式打印结果?

3 个答案:

答案 0 :(得分:11)

一个简单的规则是,您不应该在任何给定语句中多次增加相同位置。因此,您不应编写包含两个cout << y++ << ++y << endl;增量的y代码(假设int y;声明)。

有关详细信息,请参阅 C ++ 标准中的序列点未定义行为

有很多相关的问题。仔细研究它们!

答案 1 :(得分:3)

当根据规则操作*要在+之前计数,而++之前是*时,它将是如此。

 a*b++ + c // first b++ (returns **old** b), than a*b, than ...+c

但是当你有一个++ * a--,无人可以告诉你,两个操作数中的哪一个,a ++或a--将被评估为第一个。根据ANSII标准,即使您使用相同的翻译器,结果也是每次都无法预测。

引用C ++ ANSII标准:

除非另有说明,否则评估个人操作数的顺序   单个表达式的运算符和子表达式以及顺序   发生副作用的是未指明的。介于之间   标量和下一个序列点标量对象应存储它   通过表达式的评估,最多修改一次值。毛皮-   此外,只能访问先前值以确定   要存储的值。应满足本款的要求   对于每个允许的完整表达式子表达式的排序 -   锡安;否则行为未定义。 [实施例:

      i = v[i++];      // the behavior is undefined
      i = 7, i++, i++; // `i' becomes 9

      i = ++i + 1;     // the behavior is undefined 
      i = i + 1;       // the value of 'i' is incremented

序列点:

  • 在完整表达式的评估结束时(完整表达式是表达式语句,或任何其他表达式,不是任何更大表达式中的子表达式);
  • 在||,&amp;&amp;,?:和逗号运算符;
  • 和函数调用(在评估所有参数之后,和 就在实际通话之前)。

所以,||是一个序列点,但是&lt;&lt;不是。

答案 2 :(得分:2)

第一个代码的Mulitiline版本应该是:

  y = 9;
  cout << "y-- = " << y-- << "\n";
  cout << "y++ = " << y++ << "\n"
  cout << "--y = " << --y << "\n"
  cout << "++y = " << ++y << "\n"
  cout << "y = " << y << "\n";