同时使用 && || 进行短路评估操作员
Short circuit evaluation with both && || operator
我知道什么是 C 中的短路评估
a && b
(如果 a = 0,则不检查操作数 b)
a || b
(如果 a = 非零则不检查操作数 b)
但是我卡在了这个问题上
int x = 0;
if (5 || 2 && ++x)
printf("%d", x);
这输出 0
.
我的第一个想法是:
根据优先级table,优先级为++
、&&
、||
(降序)
++x
: evaluated.x
变为 1.
2 && ++x
评价。计算两个操作数。
||
被评价。
但是据此,应该打印1
,而不是0
。
我的第二个想法是:
5 || anything
anything
因为短路评估没有被评估,所以这里没有优先级。
正确。表达式短路了。你可以用这个来测试它。
if(5 || ++x) {
printf("%d\n",x);
}
由于运算符优先级,表达式 5 || 2 && ++x
等同于 5 || (2 && ++x)
。
运行次从左到右计算表达式5 || 2 && ++x
。
正如我们在 OR 中所知,如果第一个条件为真,则不会检查第二个条件。
所以这里 5 被评估为 true 所以 (2 && ++x)
将不会被执行。
这就是为什么这里 x 将保持为 0。
我知道什么是 C 中的短路评估
a && b
(如果 a = 0,则不检查操作数 b)
a || b
(如果 a = 非零则不检查操作数 b)
但是我卡在了这个问题上
int x = 0;
if (5 || 2 && ++x)
printf("%d", x);
这输出 0
.
我的第一个想法是:
根据优先级table,优先级为++
、&&
、||
(降序)
++x
:evaluated.x
变为 1.2 && ++x
评价。计算两个操作数。||
被评价。
但是据此,应该打印1
,而不是0
。
我的第二个想法是:
5 || anything
anything
因为短路评估没有被评估,所以这里没有优先级。
正确。表达式短路了。你可以用这个来测试它。
if(5 || ++x) {
printf("%d\n",x);
}
由于运算符优先级,表达式 5 || 2 && ++x
等同于 5 || (2 && ++x)
。
运行次从左到右计算表达式5 || 2 && ++x
。
正如我们在 OR 中所知,如果第一个条件为真,则不会检查第二个条件。
所以这里 5 被评估为 true 所以 (2 && ++x)
将不会被执行。
这就是为什么这里 x 将保持为 0。