繁体   English   中英

前/后增量说明

[英]Pre / Post Increment Explanation

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

当我运行这段代码时,我完全感到困惑,无法终身解决原因:

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";

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

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

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

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

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

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

但是当你有一个++ * 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

序列点:

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

所以,|| 是一个序列点,但<<不是。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM