6.2.1 逻辑类型
bool 类型:#include<stdbool.h> 包含该头文件之后可以使用bool、true、false
实际上并没有bool这种类型,实际上这些变量还是整数,定义、输出还是可以用整数。
6.2.2 逻辑运算
逻辑运算是对逻辑量进行的运算,结果只有0或1。逻辑量是关系运算或逻辑运算的结果
如果像平时做数学一样写4<=x<=6,则计算机会先判断4<x,得到的结果是0或1。然后再判断0或1是否<=6,结果为真,因此这个语句的结果是1。
所以实际上应该用逻辑与来连接两个范围。写为:x>=4&&x<=6
由此可以延伸出其应用:判断一个字符(定义为c)是否是大写字母。
- c>='A'&&c<='Z'
理解如下逻辑运算的意义:
- age>20&&age<30
- index<1||index>99
- !age<20
第一个意义是年龄在20到30,第二个是在1和99之外的index,第三个是age大于等于20
运算符的优先级:
!最高 &&其次 ||最低
加上之前我们学习过的,优先级顺序为:
也就是说!作为单目运算符优先级仅次于括号,而逻辑与和逻辑或的优先级只比赋值运算符高
短路
逻辑运算从左往右进行,如果左边运算结果已经足够决定最终结果,那么右边的计算会被跳过。
比如说逻辑与两边需要全为真,结果才为真,因此如果左边为假,结果必然是0,右边的表达式就不会计算或者判断。而对于逻辑或两边只要有真就是真,如果左边为真,结果就是1。
总结来说,&&左假则短路右边。||左真则短路右边。
如果有如下程序:
则a++>1不会被执行,会输出OK和-1,也就是说a的值没有改变。所以最好不要把赋值/组合赋值运算放到逻辑运算里
6.2.3 条件和逗号运算
条件运算
count=(count>20)?count-10:count+10;
右侧分别为条件,条件满足时候执行语句,条件不满足时候执行语句
等价于:
条件运算是早期遗留下来的语句,如果进行嵌套的话会使可读性大大降低并增加复杂性。
逗号运算
如果有语句
i=3+4,5+6;
那么如果你进行编译,程序一定会报错,这句的执行过程是,计算3+4=7,由于逗号优先级甚至低于赋值运算符,所以会先把7赋值给i,然后再来计算5+6=11,但11没有任何变量来接收它,因此编译器会报warning。如果加上括号,依旧会报warning,但是如果输出i的值,它的结果为11,因为逗号表达式的结果是右边的计算结果。
那这个东西有什么用呢?主要是用于for循环语句,我们应该还记得for语句中用分号分开了三部分,分别为初始赋值,退出条件,自增变量。在每个部分里如果想多写几个语句就需要用逗号隔开。