在下面的代码中:

#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/

10-12 16:27