我们知道在c语言当中,我们有四则运算+-*/,关系运算><==,赋值运算如"a=b".除了这三种之外,我们还有逻辑运算,
- 逻辑运算是对逻辑量进行的运算,结果只有0或1.
- 逻辑量是关系运算或逻辑运算的结果
我们来看我们有怎么样的逻辑运算:
如果我们要表达数学中的区间,如:x∈(4,6)或x∈[4,6],应该如何写c的表达式呢?很多同学犯过错误了.他们会直接表达成4<x<6,这不是c语言能正确计算的式子(虽然能编译但是意思不一样),因为4<x的结果是一个逻辑值(0或1),上面这个式子要么是0<6要么是1<6,怎无论样结果都是1,不可能给你判断x是否在4到6中间.因此我们需要写下这样的式子x>4&&x<6.如果是闭区间,则改为x>=4&&x<=6.
那如果我们想要判断一个字符c是否为大写字母呢?c>="A"&&c<="Z",小写字母同理.
我们来理解以下这三条式子:
第一个式子不再赘述.
第二个式子表明index小于0或者大于99,即index不属于0到99的范围.
第三个式子,虽然逻辑运算符的优先级是低于比较运算符的,可是呢这个!(not)是一个单目运算符,我们又有另外的一条通行的规则,就是单目运算符的优先级要高于双目运算符.所以这条式子的意思是,判断!age是否小于20,age如果是0就会变成1,如果是非0的数就会变成0,都比20小,结果都为1.如果我们要not比较age和20比较的结果,需要加上括号.
这三个运算符的优先级是不一样的.顺序为!>&&>||.那么!done&&(count>MAX)(括号其实没必要)的结果如何呢.!done和括号里面的东西都不为0,结果才为1,否则为0.
各个运算符的优先级如表:
学过逻辑运算符之后,我们之前的那个程序
可以直接改成
容易知道,我们可以把
也改成
如果我们把第一个==换成=,我们还能这样改吗?不能.
逻辑运算是自左向右进行的,如果左边的结果已经可以决定最终结果了,就不会再做右边的运算.
- a==6&&b==1,如果说a==6已经不成立了,那么右边的判断也不会再继续了.
- a==6&&b+=1,如果说a==6已经不成立了,那么右边的赋值也不会再继续了.
这当然是个好事情,可以提高我们的运算效率.但是如果当左边为false时,你的右边是有赋值的,那它不会再做了.
- 对于&&来说,左边是false时就不做右边了.
- 对于||(or or)来说,左边是true时就不做右边了.
这件事情叫做短路.我们来试一下这件事情.
#include<stdio.h>
#include<stdbool.h>
int main(){
int a=-1;
if(a>0&&a++>1){
printf("ok\n");
}
printf("%d\n",a);
return 0;
}
得到结果为-1,也就是说在判断a>0为false之后便不再执行右边的运算了.所以,我们希望你不要把赋值,包括复合赋值组合进表达式里.