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

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

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

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,打印如下:

为了深入理解Matlab中的逻辑运算符,首先要清楚'&'和'|'是用于按位逻辑运算,适用于标量和同阶矩阵的操作。而'&&'和'||'是短路逻辑运算符,它们仅在必要时才评估第二个操作数,可以提高代码效率并避免执行可能导致错误的代码。例如,在if语句中使用'&'和'|'可能会导致所有条件表达式都必须执行,即便有些条件已经能够确定整个表达式的真假。而'&&'和'||'则可以避免这种情况,从而提高效率并防止错误发生。使用这些运算符时,应当注意以下几点: 参考资源链接:[Matlab逻辑运算:&&&,|||的区别解析](https://wenku.youkuaiyun.com/doc/6e6z6vk72o?spm=1055.2569.3001.10343) - 在if和while语句的条件判断中,应优先使用'&&'和'||',因为它们提供了短路功能,能够在满足条件的情况下避免不必要的计算。 - 当进行矩阵运算时,'&'和'|'用于逐元素的逻辑运算,适用于需要对矩阵的每个元素进行逻辑操作的场景。 - 'any()'和'all()'函数在if语句中用于检查向量是否包含至少一个全部都是非零元素,从而在条件判断中起到关键作用。 更全面地掌握这些概念,你可以参考《Matlab逻辑运算:&&&,|||的区别解析》这篇资料,它详细解析了各种逻辑运算符的使用场景和区别,帮助你更精确地运用它们以提高代码质量和执行效率。 参考资源链接:[Matlab逻辑运算:&&&,|||的区别解析](https://wenku.youkuaiyun.com/doc/6e6z6vk72o?spm=1055.2569.3001.10343)
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值