3

() 优先级最高,为什么会短路?</p>

int a = 1, b = 0;
(--a)&&(b++);

为什么 (b++) 仍然短路?

4

4 回答 4

4

我不觉得“短路”这个词特别有用。

最好这样说&&并且||从左到右的评估顺序。C 标准(6.5.13)实际上很好地解释了这一点:

&& 运算符保证从左到右的评估...
如果第一个操作数比较等于 0,则不评估第二个操作数。

就是这样。左操作数的--a计算结果为 0。


运算符优先级和评估顺序有什么区别?

在这种情况下,重要的是评估顺序。运算符优先级仅保证表达式按预期解析 - 哪个操作数“粘合”到哪个运算符。

于 2021-03-04T12:36:03.953 回答
4

表达式 (--a) 使用前缀运算符并计算为 0。这是错误的,第二个表达式由于短路而未计算,如您所述。

于 2021-03-04T12:20:39.660 回答
1

你是对的,你可以使用括号覆盖运算符优先级()

例如,表达式

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++)以防止这种解释。但这种情况并非如此。

于 2021-03-04T12:39:40.430 回答
1

要理解考虑以下表达式

a * b + c * d

如果假设运算符的操作数是+从左到右计算的,那么首先将计算表达式 a * b,然后计算表达式 c * d。

与运算符 + 的操作数的求值顺序相关的假设是无效的。但它对运算符 && 有效。

所以表达式的左操作数

(--a)&&(b++);

首先被评估。如果它的值不等于 0,则计算第二个操作数。

来自 C 标准(6.5.13 逻辑与运算符)

4与按位二进制 & 运算符不同,&& 运算符保证从左到右的求值;如果计算第二个操作数,则在第一个和第二个操作数的计算之间存在一个序列点。如果第一个操作数比较等于 0,则不计算第二个操作数。

于 2021-03-04T12:26:26.267 回答