逻辑类型
布尔类型 C语言中原本没有布尔类型,如if语句中判断a > b,结果可能为1或0(整数),即判断if语句是否执行。 C语言后来支持了布尔类型,出现了新类型bool。 bool类型需要包含头文件#include<stdbool.h>才能使用bool中的true和false。 ::: tip #include<stdbool.h>需要跟在#include<stdio.h>后。 :::
逻辑运算
逻辑运算是对结果量进行的运算,结果只有0和1。 逻辑量是关系运算或逻辑运算的结果。 逻辑运算的结果用来做逻辑运算。 示例1:表达x∈(4,6)时,不可以使用4<x<6,原因是C会先计算4<x,再判断(4<x)<6。:4<x的结果是一个逻辑值,即:在4<x中,无论x和4的大小关系,4<x的运算结果都是1或0。(4<x)<6的判断结果都是成立。 x∈(4,6)用C可以正确理解的方式表达应该是x>4 && x<6 。 示例2:判断字母c是否为大写字母时,使用c>'A' && c<'Z'。 示例3:!age<20。逻辑运算符的优先级普遍低于比较运算符;单目运算符的优先级高于双目运算符。即:先判断!age,age如果为0,!age的结果就为1,如果age不为0,!age的结果就是1。正常判断!age<20的写法应为!(age<20)。 ::: tip 逻辑运算符优先级: ! > && > || ::: ::: tip 逻辑运算是自左向右进行的,如果左边的结果已经能够决定结果,就不会再做右边的计算。 短路:对于&&来说,左边结果为false时不再做右边;对于||来说,左边为true时不再做右边。 :::
#include <stdio.h>
int main()
{
int a = -1;
if( a > 0 && a++ > 1 ) {
printf("OK\n");
}
printf("%d\n",a);
return 0;
}
-1
Process exited after 0.02138 seconds with return value 0
如上程序,在判断a > 0不成立时,就不会执行a++ > 1了。 ::: warning 避免将赋值、复合赋值组合进表达式。 :::
条件和逗号运算
条件运算符
count = (count > 20) ? count - 10 : count + 10 ;
上式中共有“?”和“:”两个符号。“?”前为条件,“?”后面是条件满足时候的值,“:”后面是条件不满足时候的值。 可以翻译为:如果xxxx的话,结果为xxx,否则为xxx。 类似于如下程序:
if(count > 20)
count = count - 10;
else
count = count + 10;
::: tip 条件运算符的优先级高于赋值运算符,但是低于其他所有的运算符。 ::: 嵌套条件表达式 ::: warning 条件运算符是自右向左结合的。 考虑到复杂程度可可读性,要尽量避免使用嵌套条件表达式。 ::: 逗号运算
逗号在C语言中是一个运算符,用来连接两个表达式,并且以右边的表达式的值作为结果。 ::: tip 逗号运算的优先级是所有运算符中最低的,低过赋值运算。 :::
#include <stdio.h>
int main()
{
int i = 0;
i = 2+4,3+5;
printf("%d",i);
return 0;
}
6
Process exited after 0.01521 seconds with return value 0
在上述程序的执行过程中。可能会有如下提示: 提示表达式3+5的结果没有被用到,原因是2+4的值赋给i,赋值的优先级大于逗号,i = 6后3+5的值没有赋给任何值。 如果在2+4,3+5的外面加上括号:
#include <stdio.h>
int main()
{
int i = 0;
i = (2+4,3+5);
printf("%d",i);
return 0;
}
8
Process exited after 0.01504 seconds with return value 0
结果可能仍然提示表达式未被使用,但是是表达式2+4未被使用,原因是括号内是一个逗号表达式,以逗号右边的表达式的值作为结果,赋值给i。 ::: tip 逗号表达式在for语句中使用,如下:
for (i = 1 , j = 10 ; i < j ; i++ , j--);
括号内被分号分成三部分,每一部分是一个表达式,如果一个表达式中需要有多个计算的时候,就可以使用逗号运算。 :::