【问题标题】:Operator precedence and operator associativity rules in c++ [duplicate]C ++中的运算符优先级和运算符关联性规则[重复]
【发布时间】:2013-10-02 18:36:11
【问题描述】:

我不明白为什么下面程序的输出是63

#include <iostream>

int main() {
  int a = 20;
  a += a + ++a;
  std::cout << a;
} 

我期待它是61a += a + ++a; 到底是做什么的?

【问题讨论】:

  • 这是许多我数不清的 SO 问题的副本(但似乎找不到它们)。
  • 还有this
  • 我会在 SO 中添加一条通知,上面写着“请不要问为什么 i++ + ++i 的结果不是你所期望的。”

标签: c++ increment pre-increment computation


【解决方案1】:

标准规定:“在前一个和下一个序列点之间,一个标量对象的存储值最多只能通过表达式的评估修改一次”5 个表达式, §4),即:

a += a +  ++a 

产生未定义的行为,就像:

a = ++a;

已经做到了。它还说:“只能访问先前的值以确定要存储的值”,即如果你想更改a,你可以在同一个表达式中使用a,只是为了取回之前的值:

a = a + 1; // OK

... “否则行为未定义。”

【讨论】:

  • 谢谢,你的意思是说这个表达式可能会产生不可预知的输出,意思是有时是 63,有时是 21,有时是 20。你能解释一下吗
  • @user2747954:未定义的行为通常意味着任何事情都可能发生。这种行为可能会因您的编译器、您使用的环境而异……有时它可能会导致代码在 99.9% 的情况下完美运行,从而在等待 0.1% 的情况下产生滴答作响的炸弹……如果你知道的话产生未定义的行为,避免它
【解决方案2】:

看起来++a 在表达式的其余部分之前进行评估,所以就好像a 在类似的语句中是 21`

a += a + a;

无论如何,不​​要在这样的算术表达式中使用++a。这让人们感到困惑,并且可能是未定义的行为

【讨论】:

    【解决方案3】:

    您正在触发未定义的行为,并且没有“正确”的答案。您的编译器可以选择评估加号运算符的参数的顺序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-13
      • 1970-01-01
      • 2021-05-05
      • 2014-10-22
      • 1970-01-01
      • 1970-01-01
      • 2021-03-05
      • 1970-01-01
      相关资源
      最近更新 更多