C语言学习过程遇到的重点内容记录

何为短路求值?

所谓短路求值,其实就是C语言逻辑操作符&&||的特性,具体特性如下:

&& 逻辑与

&& 逻辑操作符的左操作数总是首先进行求值, 如果它的值为真, 则继续计算右操作数的值, 然后执行与操作得到表达式结果; 如果它的值为假, 根据与操作 有假则假 的性质可以断定该表达式的值为假, 所以不再计算右操作数的值。

|| 逻辑或

|| 逻辑操作符的左操作数也是首先进行求值, 如果它的值为假, 则继续计算右操作数的值, 然后执行与操作得到表达式结果; 如果它的值为真, 根据或操作 有真则真 的性质可以断定该表达式的值为真, 所以不再计算右操作数的值。

实际操作体验

1
2
3
4
5
6
7
8
9
10
11
# include <stdio.h>
// 短路求值
int main(){
int a = 0, b = 1;
(a = 0) && (b = 2);
printf("a = %d, b = %d\n", a, b);

(a = 1) || (b = 2);
printf("a = %d, b = %d\n", a, b);
return 0;
}

上诉代码为简单的逻辑运算程序,我们大概会这样想,输出结果为a = 0, b = 2a = 1, b = 2,但实际上并不是这样,具体输出如下所示:

1
2
3
4
5
[Running] cd "e:\code2\.vscode\" && gcc test.c -o test && "e:\code2\.vscode\"test
a = 0, b = 1
a = 1, b = 1

[Done] exited with code=0 in 0.657 seconds

为什么呢?

这就是因为这两个逻辑操作符的特性问题,在(a = 0) && (b = 2);中,由于a = 0,在逻辑与&&逻辑运算时为0,此时后面的程序不会再执行,也就是还是原来的值b = 1

(a = 1) || (b = 2);中,a的值是非零的,所以判断为1,此时后面的程序就不会在执行,这时的b的值为原来给定的值,即为b = 1