【问题标题】:operator precedence to + and ++ [duplicate]运算符优先于 + 和 ++ [重复]
【发布时间】:2014-03-04 15:37:20
【问题描述】:

给定以下代码:

 int  a=0,b=1;
 int r=a+++b;

哪些是执行的操作,按什么顺序执行?

   a++ + b
   a + ++b

我这个编译器是特定的还是取决于标准?

【问题讨论】:

  • 尽可能避免这样的陈述
  • 总是可以避免这样的病理情况。当它对人类的意义不明显时,您应该使用其他结构来明确含义(如括号和空格)。仅仅因为编译器可以解释这并不意味着我们希望人类能够尝试并解决它。
  • @starsplusplus 对此感到抱歉;你是对的。

标签: c++ c operators lexer operator-precedence


【解决方案1】:

它是(a++) + b,但不是,因为运算符优先级。

它被解析为(a++) + b,因为编译器从字符序列中获取它可以的最长标记。换句话说,词法分析器会一直读取字符,直到遇到不能与它已经拥有的相同标记的内容。

这也是它将>= 解释为一个令牌而不是>=,以及将double 解释为'double' 而不是'do uble'。

对于像

这样的语句,运算符优先级规则
a || b && c
// "a || (b && c)" NOT "(a || b) && c", because && takes precedence

但是,在您的情况下,运算符 ++ 和 + 已经确定。一旦确定了运算符,就可以应用运算符优先级规则。

Why doesn't a+++++b work in C? 有一些很好的答案应该更详细地解释这一点。

【讨论】:

  • 我会改写第二句话。 It is parsed as a ++ + b because ...。原始文件中没有(),因此此时您不想添加它们。在解释如何评估表达式(第一句)时,您可以(并且应该)使用。注意:编译器并不总是采用最长的标记(记住整个问题围绕>> 使用模板)。
  • 我真的只是说“它是这样的,因为”,这就是为什么我保持“this”的语法与前一句相同的原因。我觉得 It is X. It is Y because...It is X. It is X because... 更令人困惑,至于>>模板出现问题的全部原因是因为采用了最长的标记:词法分析器得到>>,而它应该是两个>s。
【解决方案2】:

这由operator precedence 管理。由于后缀 ++ 比 + 运算符具有更高的优先级,因此它更紧密地绑定到 a 是后递增然后添加到 b 所以结果是:

(a++) + b

【讨论】:

  • 不正确。执行 order 由运算符优先级控制。但是到那时,您已经有了操作员。见stackoverflow.com/questions/7485088/…
  • @user3283017 正如已经指出的那样,这个答案是错误的。请您将其取消标记为已接受并接受正确的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-08
  • 2015-04-17
  • 1970-01-01
  • 1970-01-01
  • 2021-03-08
相关资源
最近更新 更多