逻辑操作符基础知识
逻辑操作符作用于表达式,在C语言中结果会返回0(假)或1(真)
!改变单个表达式的真假,即 真–>假,假–>真
&& 两侧表达式都为真,结果才为真
|| 两侧表达式中至少有一个为真,结果就为真
特点:短路
如果左侧表达式已经满足逻辑运算符的条件,则不再执行右侧的表达式
比如:
表达式1 && 表达式2,如果表达式1求出的结果为假,那么就不会再执行表达式2了,而是直接返回0(假)
表达式1 || 表达式2,如果表达式1求出的结果为真,那么就不会再执行表达式2了,而是直接返回1(真)
题目:
int main()
{
int i = 0, a = 0, b = 2, d = 4;
i = a++ && ++b && d++;
printf(" i = %d\n a = %d\n b = %d\n d = %d\n", i, a, b, d);
return 0;
}
分析:
a是后++,先使用(a=0,表达式为假),再自增1(a=1)
由于&&有短路的特点,只要有一个表达式结果为假,后面的表达式就不再判断, 直接返回0(假),也就是表达式++b和d++不会执行,并且最后 i = 0
运行结果:
将上面的题目中a的值改为1后:
int main()
{
int i = 0, a = 1, b = 2, d = 4;
i = a++ && ++b && d++;
printf(" i = %d\n a = %d\n b = %d\n d = %d\n", i, a, b, d);
return 0;
}
分析:
a是后++,先使用(a=1,表达式结果为真),再自增1(a=2)
表达式 a++ 结果不为假,继续判断
b是前++,先自增1(b=3),再使用–>表达式结果不为假,继续判断
d是后++,先使用,后自增1(d = 5)
因为三个表达式结果都为真,所以返回1,最后 i=1
运行结果:
在上一个题目基础上,将&&改成||后:
int main()
{
int i = 0, a = 1, b = 2, d = 4;
i = a++ || ++b || d++;
printf(" i = %d\n a = %d\n b = %d\n d = %d\n", i, a, b, d);
return 0;
}
分析:
a是后++,先使用(a=1,表达式结果为真),再自增1(a=2)
由于||有短路的特点,即只要有一个表达式为真,那么后面的表达式就不再判断
所以表达式 ++b 和 d++就不再执行
因为表达式a++为真,返回1,所以 i = 1
运行结果:
在上一个题目基础上,将a的值改为0后:
int main()
{
int i = 0, a = 0, b = 2, d = 4;
i = a++ || ++b || d++;
printf(" i = %d\n a = %d\n b = %d\n d = %d\n", i, a, b, d);
return 0;
}
分析:
a是后++,先使用(a=0,第一个表达式结果为假),再自增(a=1)
第一个表达式判断结果为假,继续往后判断
b是前++,先自增1(b=3),再使用(表达式结果为真)所以表达式a++ || ++b 即 0 || 3 为真
根据 || 短路的特点,由于 a++ || ++b || d++(可以看成 (a++ ||++b ) || d++ ) 已经有一个表达式为真了, 所以后面的表达式,即d++不会再判断了,并且返回1,所以 i = 1
运行结果: