一,逻辑类型和运算
1.逻辑类型bool
需要输入头文件#include<stbool.h>之后就可以使用bool和true,false.
事实上并没有真正的bool类型,其本质仍为整数
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdbool.h>
int main()
{
bool t = 7 > 6;
bool f = false;
printf("%d %d", t, f);
return 0;
}
输出结果为
2.逻辑运算
逻辑运算是对逻辑量进行的运算,结果只有0/1,逻辑量是关系运算或逻辑运算的结果
区别 !age<20 和 !(age<20) 因为!属于单目运算符 优先级在比较运算之前,所以前者输出的值无论age赋值多少都为1(!age的值不是0就是1,但都比20小,所以判断为真,输出1).
优先级 +
短路
- 逻辑运算是自左向右进行的,如果左边的结果已经能够决定结果了,就不会做右边的计算
-
如果有a==6&&b==1 当a的值不为6时运算就结束了,因为逻辑与要求两边都为真结果才为真,这样提前结束计算会避免不必要的计算,提高计算速度;而如果有a==6&&b+=1,此时当a的值不为6时,右边的赋值就会被忽略,造成短路
- 对于&&,如果左边是false时就不做右边了
- 对于||,如果左边是true时就不做右边了
- 因此不要把赋值,包括复合赋值组合进表达式!
二,级联和嵌套的判断
1.嵌套的if-else
比较最大数
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{//比较最大数
int a, b, c;
int max = 0;
printf("请输入三个数字。\n");
scanf("%d %d %d", &a, &b, &c);
if (a > b)
{
if (a > c) {
max=a ;}
else max= c;
}
else {
if (b > c) {
max=b;
}
else max=c;
}
printf("最大值为%d", max);
return 0;
}
else的匹配
else总是与最近的拿个if匹配 但前提是在同一个大括号中。
缩进
有时匹配好的if-else会同时缩进,但缩进格式不能暗示else的匹配。
if(code==READY)
if(count<20)
printf("一切正常\n");
else
printf("继续等待\n");
当我希望else与第一个if匹配时 ,可以将最近的if放入大括号中。
if(code==READY)
{if(count<20)
printf("一切正常\n");}
else
printf("继续等待\n");
建议
养成在if或else后面总是用{}的习惯,即使只有一条语句。
2.级联的if-else
分段函数
if (x<0){
f=-1;
}else if (x==0){
f=0;
}else{
f=2*x;
}
三,多路分支
switch-case
对于一个判断程序
int main()
{
int type;
scanf("%d", &type);
if (type == 1)
printf("你好");
else if (type == 2)
printf("早上好");
else if (type == 3)
printf("中午好");
else if (type == 4)
printf("下午好");
else
printf("???");
return 0;
}
可以用switch-case来实现
int main()
{
int type;
scanf("%d", &type);
switch (type) {
case 1:
printf("早上好");
break;
case 2:
printf("中午好");
break;
case 3:
printf("下午好");
break;
case 4:
printf("晚上好");
break;
default:
printf("???");
}
return 0;
}
switch-case并没有一步一步的执行判断,更为精干
- 控制表达式只能是整数型的结果。
- 常量可以是常数,也可以是常数计算的表达式。 C99!
- switch语句可以看作是一种基于计算的跳转,计算控制表达式的值后,程序会跳转到相匹配的case(分支标号)处。分支标号只是说明switch内部位置的路标,在执行完分支中的最后一条语句后,如果后面没有break,就会顺序执行到下面的case里去,直到遇到一个break,或者switch结束为止。