在下面的代码中:
#include <stdio.h>
int main()
{
int a = 1;
int b = 1;
int c = a || --b;
int d = a-- && --b;
printf("a = %d, b = %d, c = %d, d = %d", a, b, c, d);
return 0;
}
我期望输出为:
因为由于下面一行中的短路,即a--返回0,所以其他部分不会正确执行?
int d = a-- && --b;
输出为:
谁能解释一下?
最佳答案
int c = a || --b;
在这一行中,C标准要求C实现首先执行
a
的评估,如果不为零,则不评估 --b
。尽管--
的优先级高于||
,但这仅意味着--
与b
分组是为了确定表达式的结构,而不是为了评估表达式。 ||
运算符的左侧必须在右侧之前评估,并且如果左侧为true,则右侧甚至部分都不得评估。因此,在完成上述操作后,
b
不变。现在仍然是1。int d = a-- && --b;
与
||
一样,首先评估&&
的左侧。因此a--
被评估。这会将a
更改为0。但是,更改之前a--
的值为a
,因此它为1。值为0会阻止对右侧进行求值(因为一旦我们知道左侧为零,我们就会知道完整&&
表达式的值是零)。但是,由于左侧不为零,因此必须评估--b
以完成&&
。这会将b
更改为0。“短路”表示左侧首先评估,首先评估,但在必要时仍评估右侧。关于c - 递增/递减运算符时AND的短路,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19606560/