C++ 优先于&&||

C++ 优先于&&||,c++,c,c++11,C++,C,C++11,我正在读这篇文章 . 它说,即使&&的优先级大于| |,我们需要从左到右计算表达式,如果第一个表达式为真,则不需要计算第二个表达式。 但优先级是计算的顺序,因此,应首先计算所有预增量,然后计算++j&&++k。这篇文章在这一点上似乎模棱两可。不是吗?来自标准 §5.14逻辑与运算符 &&运算符从左向右分组。操作数都在上下文中转换为bool。如果两个操作数都为true,则结果为true,否则为false。与&、&&不同,保证从左到右求值:如果第一个操作数为false,则不求值第二个操作数 结果是一

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

来自标准

§5.14逻辑与运算符

&&运算符从左向右分组。操作数都在上下文中转换为bool。如果两个操作数都为true,则结果为true,否则为false。与&、&&不同,保证从左到右求值:如果第一个操作数为false,则不求值第二个操作数

结果是一场闹剧。如果对第二个表达式求值,则与第一个表达式关联的每个值计算和副作用都将在与第二个表达式关联的每个值计算和副作用之前排序

因此,在您的示例中:

(++j && ++k)
第一次评估将是

++j
然后假设j没有变成0,因此是错误的

++k
然后


优先级与求值顺序不同。优先级意味着括号自动插入的位置?评估顺序是指每件物品的评估顺序?优先级影响分组,而不是评估顺序。a | | b&&c受优先级的影响,因为&&在| |之前抓住了b,而让| |&&c抓住整个&&表达式:a | | b&&c。@RaymondChen:似乎是一个常见的误解搞错了?好的。我告诉你优先级只是执行操作数与运算符的分组,但是我们如何知道求值顺序呢?它是在什么地方定义的吗?有人能告诉我逻辑表达式的求值顺序与算术表达式的求值顺序之间的区别吗?OP从链接的问题中引用了++i | |++j&++k,他们认为应该首先求值++j&++k。如果增量j不为零,k才递增
j && k // with both values incremented