三个逻辑运算符&&,||,!
我们知道,逻辑表达式中,逻辑与比逻辑或的优先级要高,但是有些场合我们需要注意,否则容易造成错误。
程序中的短路
||从左向右开始计算∶
- 当遇到为真的条件时停止计算,整个表达式为真
- 所有条件为假时表达式才为假
&&从左向右开始计算︰
- 当遇到为假的条件时停止计算,整个表达式为假
- 所有条件为真时表达式才为真
以一个程序来说明:
#include <stdio.h>
int main()
{
int i=0;
int j=0;
int k=0;
++i||++j&&++k;
printf("%d ,%d,%d \r\n",i,j,k);
return 0;
}
// 0 1 1
运行得到的结果是 :0 1 1,是否符合你的预期呢?
这个地方很容易出错,看下图
在&&和 || 混合运算时,整个表达式被看作 || 表达式,编译器从左向右开始计算&&表达式,当某个&&表达式的值为真时,停止计算,整个表达式的值为真。
一句话:
与的优先级高,体现在先算与,最后的表达式还是算或,或是最后算的。
疑惑是不是迎刃而解?
再来检测一下掌握情况,看与你的预计结果是不是一样。
#include <stdio.h>
int g = 0;
int f()
{
printf("In f()...\r\n");
return g++;
}
int main()
{
if(g ||f() && f())
{
printf("In if statement:%d\n",g);
}
printf("In main():%d\n",g);
return 0;
}
答案:
”!“呢?
遇0变1,非0都是真。
!0==1;
!1==0;
!100=0;
小结
- 程序中的逻辑表达式遵从短路规则
- 在&&与 || 混合运算时∶
整个表达式被看作 || 表达式
从左向右先计算&&表达式
最后计算|| 表达式 - 逻辑非!运算符只认得0,碰见0返回1,否则统统返回0,只有0才代表假,其余所有值均代表真。