&& || 与或 逻辑运算符的短路运算

关于&&和||的短路运算问题,我们主要关注三个问题:什么是&&和||的短路运算?有什么用?怎么用?

问题一:什么是&&和||的短路运算?

1、&&和||属于逻辑运算符。关于&&和||的表达式的运算规则是这样的:
表达式1 || 表达式2,只要任意表达式为true,则整个表达式的运算结果为true。
表达式1 && 表达式2,只有所有表达式都为true,则整个表达式的运算结果才为true。根据集合的补集的思想,只要任意表达式为false,则整个表达式的运算结果为false。
2、&&和||的短路运算,是指如果在进行前面的表达式的运算过程,通过判断已经明确的知道整个表达式的结果,那么就不会进行后面表达式的运算判断。例如:
表达式1 || 表达式2 || 表达式3...|| 表达式n,如果表达式1的运算结果为true,则整个表达式的结果为true,同时不会再对后面的表达式2、表达式3到表达式n进行运算判断。如果表达式1的运算结果为false,则根据表达式2的运算结果继续判断。
表达式1 && 表达式2 && 表达式3...&& 表达式n,如果表达式1的运算结果为false,则整个表达式的结果为false,同时不会再对后面的表达式2、表达式3到表达式n进行运算判断。如果表达式1的运算结果为true,则根据表达式2的运算结果继续判断。

问题二:&&和||的短路运算有什么用?

1、由于&&和||的表达式存在短路运算现象,在短路之后不会对后面的表达式进行运算,所以含有&&和||的表达式最好不要进行变量的赋值和运算操作,可以先计算好每个表达式的结果,直接拿结果进行&&和||的运算。
在代码编写的时候就要注意这一点,以防由于&&和||的短路运算导致写出来的代码运算结果与预期的不同。
2、把能快速确定整个表达式结果true或false的表达式放在前面,这样由于短路运算后面的表达式可能不会被运算到,节省处理器的运算时间。

问题三:怎么用?

通过举例子,&&和||的短路运算的使用。
例子1:
#include <stdio.h>
int main()
{
	int a = 1, b = 2, c = -3, d = -1;
	
	printf("before expression: a= %d	b= %d	c= %d	d= %d\r\n", a, b, c, d);
	d = (a+1>0) || (++b>0) || (c-4)>0;

	printf("after expression: a= %d	b= %d	c= %d	d= %d\r\n", a, b, c, d);
	return 1;
}
分析,由于表达式1( a+1>0)为true,根据||的短路运算,则d=true=1,同时表达式2 (++b>0) ,表达式3 (c-4)>0不会进行运算,所以b=2,c=-3。打印如下:

例子2:
#include <stdio.h>
int main()
{
	int a = -1, b = 2, c = -3, d = -1;
	
	printf("before expression: a= %d	b= %d	c= %d	d= %d\r\n", a, b, c, d);
	d = (a+1>0) || (++b>0) || (c-4)>0;

	printf("after expression: a= %d		b= %d	c= %d	d= %d\r\n", a, b, c, d);
	return 1;
}
分析,由于表达式1( a+1>0)为false,继续计算表达式2 (++b>0),(++b = 3) >0为true,根据根据||的短路运算,则d=true=1,同时表达式3 (c-4)>0不会进行运算,所以a=-1,b=3,c=-3。打印如下:

例子3:
由于&&和||的表达式存在短路运算现象,在短路之后不会对后面的表达式进行运算,所以含有&&和||的表达式最好不要进行变量的赋值和运算操作,可以先计算好每个表达式的结果,直接拿结果进行&&和||的运算。比如,上述例子1中,无论d的结果如何,假如我们代码设计上一定要对表达式2 (++b>0)进行运算,那就要先对表达式2进行,运算再拿结果进行逻辑判断,利用整体思想,例子1代码改为:
#include <stdio.h>
int main()
{
	int a = 1, b = 2, c = -3, d = -1;
	int A = -1, B = -1, C = -1;
	printf("before expression: a= %d		b= %d	c= %d	d= %d\r\n", a, b, c, d);

	A = a+1>0;
	B = ++b>0;
	C = c-4>0;	
	d = A || B || C;
	printf("after expression: a= %d		b= %d	c= %d	d= %d\r\n", a, b, c, d);
	return 1;
}
分析,由于先对各个表达式进行运算,再对各个表达式结果进行||运算,这样确保了每个表达式中的赋值和运算操作都能被执行到。所以即使在表达式1时为true,短路了,但是表达式2 (B=++b=3),b=3,打印如下:

例子4:
#include <stdio.h>
int main()
{
	int a = -1, b = 2, c = -3, d = -1;
	
	printf("before expression: a= %d	b= %d	c= %d	d= %d\r\n", a, b, c, d);
	d = (a+1>0) && (++b>0) && (c-4)>0;

	printf("after expression: a= %d		b= %d	c= %d	d= %d\r\n", a, b, c, d);
	return 1;
}
分析,由于表达式1( a+1>0)为false,根据&&的短路运算,则d=false=0,同时表达式2 (++b>0) ,表达式3 (c-4)>0不会进行运算,所以b=2,c=-3。打印如下:

例子5:
#include <stdio.h>
int main()
{
	int a = 1, b = -2, c = -3, d = -1;
	
	printf("before expression: a= %d		b= %d	c= %d	d= %d\r\n", a, b, c, d);
	d = (a+1>0) && (++b>0) && (c-4)>0;

	printf("after expression: a= %d		b= %d	c= %d	d= %d\r\n", a, b, c, d);
	return 1;
}
分析,由于表达式1( a+1>0)为true,继续计算表达式2 (++b>0),(++b =-1) >0为false,根据根据&&的短路运算,则d=false=0,同时表达式3 (c-4)>0不会进行运算,所以a=1,b=-1,c=-3。打印如下:

例子6:
#include <stdio.h>
int main()
{
	int a = -1, b = 2, c = -3, d = -1;
	int A = -1, B = -1, C = -1;
	printf("before expression: a= %d	b= %d	c= %d	d= %d\r\n", a, b, c, d);

	A = a+1>0;
	B = ++b>0;
	C = c-4>0;	
	d = A && B && C;
	printf("after expression: a= %d		b= %d	c= %d	d= %d\r\n", a, b, c, d);
	return 1;
}
分析,由于先对各个表达式进行运算,再对各个表达式结果进行&&运算,这样确保了每个表达式中的赋值和运算操作都能被执行到。所以即使在表达式1时为false,短路了,但是表达式2 (B=++b=3),b=3,打印如下:

猜你喜欢

转载自blog.csdn.net/bulebin/article/details/79345875