在 C 中使用多个逻辑运算符时意外的短路评估
Unexpected short circuit evaluation when used more than one logical operators in C
在 C 程序中:
1 || 0 && 0
结果是 1
。我认为这种行为是因为 OR 运算符由于左侧的 1
而使右侧的其余部分 (0 && 0
) 短路。
但
0 && 0 || 1
也会导致 1
。我很困惑为什么AND运算符左侧的0
没有短路0 || 1
,答案不是0
。
请指导我!
这与 operator precedence 有关。
逻辑与运算符的优先级高于逻辑或运算符||。所以这个:
1 || 0 && 0
解析为:
1 || (0 && 0)
还有这个:
0 && 0 || 1
解析为:
(0 && 0) || 1
所以在后一种情况下,首先评估 0 && 0
。这导致值 0,所以现在您有 0 || 1
。 OR 的左侧为假,因此这会导致计算右侧,从而导致 ||
运算符的结果为 1.
在 C 程序中:
1 || 0 && 0
结果是 1
。我认为这种行为是因为 OR 运算符由于左侧的 1
而使右侧的其余部分 (0 && 0
) 短路。
但
0 && 0 || 1
也会导致 1
。我很困惑为什么AND运算符左侧的0
没有短路0 || 1
,答案不是0
。
请指导我!
这与 operator precedence 有关。
逻辑与运算符的优先级高于逻辑或运算符||。所以这个:
1 || 0 && 0
解析为:
1 || (0 && 0)
还有这个:
0 && 0 || 1
解析为:
(0 && 0) || 1
所以在后一种情况下,首先评估 0 && 0
。这导致值 0,所以现在您有 0 || 1
。 OR 的左侧为假,因此这会导致计算右侧,从而导致 ||
运算符的结果为 1.