() 优先级最高,为什么会短路?</p>
int a = 1, b = 0;
(--a)&&(b++);
为什么 (b++) 仍然短路?
() 优先级最高,为什么会短路?</p>
int a = 1, b = 0;
(--a)&&(b++);
为什么 (b++) 仍然短路?
我不觉得“短路”这个词特别有用。
最好这样说&&
并且||
有从左到右的评估顺序。C 标准(6.5.13)实际上很好地解释了这一点:
&& 运算符保证从左到右的评估...
如果第一个操作数比较等于 0,则不评估第二个操作数。
就是这样。左操作数的--a
计算结果为 0。
在这种情况下,重要的是评估顺序。运算符优先级仅保证表达式按预期解析 - 哪个操作数“粘合”到哪个运算符。
表达式 (--a) 使用前缀运算符并计算为 0。这是错误的,第二个表达式由于短路而未计算,如您所述。
你是对的,你可以使用括号覆盖运算符优先级()
。
例如,表达式
a && b || c
相当于
(a && b) || c
,
因为&&
具有比 更高的优先级||
。您可以通过将其更改为来覆盖此优先级
a && (b || c)
所以现在||
优先&&
。
但是,操作员的顺序不会改变各个操作员的行为。特别是,两个运算符仍将使用短路。因此,即使||
具有比 更高的优先级&&
,&&
运算符仍将在其右侧操作数之前评估其左侧操作数。
在我上面的两个示例中,&&
运算符仍然会在评估ora
之前进行评估。运算符优先级只会影响运算符的右侧操作数是表达式还是。b
(b || c)
&&
b
(b || c)
因此,在您的示例中,通过编写(--a)&&(b++)
而不是--a&&b++
,您只是确保--
and++
运算符优先于&&
运算符。这不是必需的,因为 C 语言指定这些运算符已经具有优先级。
在 C 语言指定&&
运算符优先于--
and++
运算符的假设场景中,则表达式--a&&b++
将被解释为--(a&&b)++
,并且有必要编写(--a)&&(b++)
以防止这种解释。但这种情况并非如此。
要理解考虑以下表达式
a * b + c * d
如果假设运算符的操作数是+
从左到右计算的,那么首先将计算表达式 a * b,然后计算表达式 c * d。
与运算符 + 的操作数的求值顺序相关的假设是无效的。但它对运算符 && 有效。
所以表达式的左操作数
(--a)&&(b++);
首先被评估。如果它的值不等于 0,则计算第二个操作数。
来自 C 标准(6.5.13 逻辑与运算符)
4与按位二进制 & 运算符不同,&& 运算符保证从左到右的求值;如果计算第二个操作数,则在第一个和第二个操作数的计算之间存在一个序列点。如果第一个操作数比较等于 0,则不计算第二个操作数。