【问题标题】:Precedence of && over || [duplicate]&& 的优先级 || [复制]
【发布时间】:2015-11-04 00:59:39
【问题描述】:

我正在阅读这篇文章 Precedence of && over || .它说,即使 && 的优先级大于 ||,我们也需要从左到右计算表达式,如果第一个表达式结果为真,那么我们不需要计算第二个表达式。 但是优先级是评估的顺序,因此应该首先评估所有预增量,然后评估 (++j && ++k)。这篇文章在这一点上似乎模棱两可。不是吗?

【问题讨论】:

  • 优先级与评估顺序不同。优先级的意思是“括号在哪里自动插入?”评估顺序是“每个部分的评估顺序是什么?”
  • 优先级影响分组而不是评估顺序。 a || b && c 受优先级影响,因为&&|| 之前抢占b,留下|| 抢占整个&& 表达式:a || (b && c)
  • @RaymondChen:似乎是一个常见的误解。 :( 误判?
  • 好的。我告诉你,优先级只是用运算符对操作数进行分组,但我们如何知道评估的顺序?它是在某个地方定义的吗?
  • 谁能告诉我逻辑表达式求值顺序与算术表达式求值顺序之间的区别?

标签: c++ c c++11


【解决方案1】:

来自标准

§5.14 逻辑与运算符

&& 运算符从左到右分组。操作数都根据上下文转换为bool。如果两个操作数都为真,则结果为真,否则为假。与& 不同,&& 保证从左到右的评估:如果第一个操作数为假,则不评估第二个操作数。

结果是bool。如果对第二个表达式求值,与第一个表达式相关的每个值计算和副作用都会在与第二个表达式相关的每个值计算和副作用之前排序

所以,在你的例子中:

(++j && ++k)

第一次评估将是

++j

那么(假设j 没有变成0,因此是假的)

++k

然后

j && k // with both values incremented

【讨论】:

  • OP 引用了链接问题中的++i || ++j && ++k,他们认为应该首先评估++j && ++k
  • k 仅在增加的j 不为零时增加
猜你喜欢
  • 2020-02-06
  • 2017-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-16
  • 1970-01-01
  • 2021-03-06
相关资源
最近更新 更多