一.逻辑取反运算符 !
比如,我们有一个变量叫 flag,如果 flag 为假,要做一个什么事情,就可以这样写代码:
#include<stdio.h>
int main()
{
int flag=0;
if(!flag)
{
printf("do something\n");
}
return 0;
}
如果 flag 为真,!flag 就是假,如果 flag 为假,!flag 就为真。
所以上面的代码的意思就是 flag 为假,执行 if 语句中的代码。
二.短路
C语言逻辑运算符有一个特点,它总是先对左侧的表达式求值,再对右侧的表达式求值,这个顺序是保证的。
如果左边的表达式满足逻辑运算符的条件,就不再对右边的表达式求值,这种情况称为“短路”。
if(month >= 3 && month <=5)
表达式中 && 的左操作数是 month >= 3,右操作数是 month <= 5,当左操作数 month >=3 的结果是 0 的时候,即使不判断 month <= 5,整个表达式的结果也是 0(不是春季)。
对于 || 操作数是怎么样呢?我们结合前面的代码:
if(month == 12 || month == 1 || month == 2)
如果month == 12,则不用再判断 month 是否等于 1 或者 2,整个表达式的结果也是 1(是冬季)。所以,|| 操作符的左操作数的结果不为 0 时,就无需执行右操作数。
像这种仅仅根据左操作数的结果就能知道整个表达式的结果,不再对右操作数进行计算的运算称为短路求值。
联系:阅读代码,计算代码输出的结果:
#include<stdio.h>
int main()
{
int i=0,a=0,b=2,c=3,d=4;
i=a++ && ++b && d++;
//i=a++ || ++b ||d++;
printf(" a=%d\n b=%d\n c=%d\n d=%d\n",a,b,c,d);
return 0;
}