我们在 中提到C语言的短路概念,而仅仅根据左操作数的结果就能知道整个表达式的结果,不再对右操作数进行计算的运算被称为短路求值。
为了更直观的表达短路求值的概念,下面让我们看个代码,根据代码计算输出的结果:
#include <stdio.h>
int main()
{
int i = 0, a = 0, b = 2, c = 3, d = 4;
i = a++ && ++b && d++;
printf("a = %d\nb = %d\nc = %d\nd = %d\n", a, b, c, d);
printf("i = %d\n", i);
return 0;
}
上面代码中,i = a++ && ++b && d++;这句在计算机执行时,首先判断a是否为真,我们知道int i = 0, a = 0, b = 2, c = 3, d = 4;这里赋予给a的值为0,C语言中0即为假,而a++的自加操作是先赋值在进行自加操作,它是先计算a = 0,然后才进行自加。
&&是逻辑与的意思,两边都为真,即非零才会为真,此时a的值为0,那么后面的 ++b && d++将不在会运行,直接进入下一步。
代码输出的结果如下显示:
从上面的结果我们看到,只有a++进行了运算,b和d的值并未发生改变,最后i的值为0。
我们把上面代码修改下,把变量a的初始值改为0:
#include <stdio.h>
int main()
{
int i = 0, a = 1, b = 2, c = 3, d = 4;
i = a++ && ++b && d++;
printf("a = %d\nb = %d\nc = %d\nd = %d\n", a, b, c, d);
printf("i = %d\n", i);
return 0;
}
根据第一代码的分析,这里我们把变量a的初始值改为1以后,那么i = a++ && ++b && d++;这句代码运行时先判断a的值,此时a的值为1,非零即为真,继续进行下一句 ++b的判断,此时不论是b还是d的值都是非零,最终,它的输出结果如下:
对于 || 操作符是怎么样呢?看下面的代码:
#include <stdio.h>
int main()
{
int i = 0, a = 0, b = 2, c = 3, d = 4;
i = a++ || ++b || d++;
printf("a = %d\nb = %d\nc = %d\nd = %d\n", a, b, c, d);
printf("i = %d\n", i);
return 0;
}
|| 逻辑或运算符,是两边操作数有一个为真,那么整个表达式都为真,这段代码中 a的初始值为0,那么尽兴下一段 ++b代码判断,变量 b的初始值为2,但是由于 ++b是先运算后赋值,所以在这里b的值已经发生了变化,被赋值为3,3是非零,表达式返回为真,那么变量i的值此时被赋予1,后面的d++不在运行,直接执行下一行代码。