首页 > 编程知识 正文

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

时间:2023-05-03 11:31:26 阅读:205091 作者:668

关于&&和||的短路运算问题,我们主要关注三个问题:什么是&&和||的短路运算?有什么用?怎么用?
问题一:什么是&&和||的短路运算? 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= %db= %dc= %dd= %drn", a, b, c, d);d = (a+1>0) || (++b>0) || (c-4)>0;printf("after expression: a= %db= %dc= %dd= %drn", 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= %db= %dc= %dd= %drn", a, b, c, d);d = (a+1>0) || (++b>0) || (c-4)>0;printf("after expression: a= %db= %dc= %dd= %drn", 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= %db= %dc= %dd= %drn", a, b, c, d);A = a+1>0;B = ++b>0;C = c-4>0;d = A || B || C;printf("after expression: a= %db= %dc= %dd= %drn", 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= %db= %dc= %dd= %drn", a, b, c, d);d = (a+1>0) && (++b>0) && (c-4)>0;printf("after expression: a= %db= %dc= %dd= %drn", 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= %db= %dc= %dd= %drn", a, b, c, d);d = (a+1>0) && (++b>0) && (c-4)>0;printf("after expression: a= %db= %dc= %dd= %drn", 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= %db= %dc= %dd= %drn", a, b, c, d);A = a+1>0;B = ++b>0;C = c-4>0;d = A && B && C;printf("after expression: a= %db= %dc= %dd= %drn", a, b, c, d);return 1;} 分析,由于先对各个表达式进行运算,再对各个表达式结果进行&&运算,这样确保了每个表达式中的赋值和运算操作都能被执行到。所以即使在表达式1时为false,短路了,但是表达式2 (B=++b=3),b=3,打印如下:

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。