I.结构化
人说“C语言是个结构化的语言”
那你有没有想过什么什么是结构化呢?
我们生活中要完成一件事
都可以归类为三种结构(或它们的复合体):
- 顺序结构:如先做什么,后做什么
- 分支结构:如往左还是往右
- 循环结构:如重复做一件事
而本篇讲的就是分支结构中的分支语句。
II.主要语句
I.if
1.大括号
if常常和else if和else搭配
我们看看下面这段代码
int main()
{
int age = 0;
scanf("%d", &age);
if (age < 18)
{
printf("未成年\n");//当if下面只有一行代码,那么if的{}就是可写可不写。
}
else if (age < 30)//else if可以不用靠&&连接多个条件,而直接实现一个区间内的判断
{
printf("年轻人\n");
}
else if (age < 50)
{
printf("中年人\n");
}
else if (age < 100)
{
printf("老年人\n");
}
else
{
printf("寿比南山\n");
}
return 0;
}
这一段代码包含了if语句常见的else if和else
当你看第一个注释的时候
你就知道,if语句使用时
如果if下需要执行的代码只有一行
则你无需加上{}
就可以顺利执行
那如果有多行代码时也不加{}呢?
这个时候第一行代码还是一样执行
后面的代码呢?
它们不会失效
而是直接执行
相当于原本这段代码
if (age < 18)
printf("未成年\n");
printf("成年\n");
会等同于这段代码
if (age < 18)
{
printf("未成年\n");
}
printf("成年\n");
第一段代码之后的陆续几行
都等同于被隐形的{}排除在外了
成为了一个独立于if之外的表达式
搞清这个后
我们还要扩充一个if的知识
2.执行
什么时候if会执行呢?
你可能觉得是满足if里括号的表达式时就会执行
但并不是这样
计算机并不深究这个
if只管括号里的是真命题还是假命题
只要是真命题它就会执行
所以经常会出现一个错误
即把比较写成赋值
int main()
{
int a = 0;
if (a == 1)
{
printf("good");
}
return 0;
}
这是一段正确的代码
我们要表达的意思就是如果a和1相等
if就执行
这里自然是不会执行的
那如果我们错写成下面这段代码呢?
int main()
{
int a = 0;
if (a = 1)
{
printf("good");
}
return 0;
}
那它就会执行!
因为括号里只是个赋值表达式
把1的值赋予给了a而已
其本质不可能为假
这个时候起到的效果就和我们预想的完全不一样了
这个时候我们有一种优化的习惯来解决这个问题
int main()
{
int a = 0;
if (1 == a)//把a放到后面来写
{
printf("good");
}
return 0;
}
当我们写成这种形式的时候
表达的意思是一样的
即a和1是相同大小的
但如果我们这个时候我们错把==写成=
我们的编译器就会报错
因为a是变量,b是常量
只能把常量赋予给变量
而不能把变量赋予给常量
这算是一种防失误的措施
是一种好习惯
II.else if
我们回到这个代码来
int main()
{
int age = 0;
scanf("%d", &age);
if (age < 18)
{
printf("未成年\n");//当if下面只有一行代码,那么if的{}就是可写可不写。
}
else if (age < 30)//else if可以不用靠&&连接多个条件,而直接实现一个区间内的判断
{
printf("年轻人\n");
}
else if (age < 50)
{
printf("中年人\n");
}
else if (age < 100)
{
printf("老年人\n");
}
else
{
printf("寿比南山\n");
}
return 0;
}
我们发现第一个else if的括号里面是age < 30
其实它表达的就是当18<= age <30时执行
那你可能会疑惑
既然如此
我们为什么不直接在括号里填上18<= age <30呢?
这是因为C语言中不支持这种表达的直接实现
它会先被拆解为“18<= age”
假如18真小于等于 age,则为真
我们知道C语言中为真返回的是1
然后再被拆解为“1 < 30”
发现为假
所以else if不会去执行
因此我们可以借用&&来连接前后两个比较表达式
即age < 30可以写为age >= 18 && age < 30
但age < 30 更简洁
所以这里我采用了这种方式
因为前面if已经有age < 18 的情况了
我们这里写age < 30就可以了
你可以看到后续的的else if我也是这样写的
III.else
我们看看这段代码
int main()
{
int a = 0;
int b = 2;
if (0 == a)
if (2 == b)
printf("hehe\n");
else
printf("haha\n");
return 0;
}
我问你最后输出的结果是什么?
如果你想的是输出haha
那你成功被我带进坑里了
这段代码最后的输出结果是什么也没有
为什么?
因为这种格式是我故意调出来的
实际上else的就近原则使得它是对应上一个离它最近的if
也就是这个if
if (2 == b)
printf("hehe\n");
实际上,更美观和便于理解的代码是这样的:
int main()
{
int a = 1;
int b = 2;
if (0 == a)
if (2 == b)
printf("hehe\n");
else
printf("haha\n");
return 0;
}
当没有大括号限制时
else就是遵循这么一个就近原则的
IV.switch
switch常常和default在一起使用
我在这就把它们一块给讲了
看下面这段代码
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)//day就是参数,而且是整形参数,所以数组类型也行。不过字符也可以,为什么呢?因为字符会对应ASCII表转换成整形。
{
case 1:
printf("星期一,要工作\n");
break;//case只是点明入口,如果没有break,就会一路执行下去,相当于break是出口
case 2:
printf("星期二,要工作\n");
break;
case 3:
printf("星期三,要工作\n");
break;
case 4:
printf("星期四,要工作\n");
break;
case 5:
printf("星期五,要工作\n");
break;
case 6:
printf("星期六,休息吧\n");
break;
case 7:
printf("星期天,休息吧\n");
break;
default://default相当于if语句中的else,当参数没有可执行的case时,就可以执行。
printf("请确认自己输入的是数字1到7\n");
}
return 0;
}
这段代码首先就告诉了我们switch的使用格式:
switch ((一个参数))
{
case (具体的参数):
break;
......
default :
......
}
我们看看这个格式吧case switch default break都是固定的
不能随意命名的
我们需要给定一个参数
让它参与到switch的执行当中
1.case
这里容易误解的一个点就是case
你会不会想break是干嘛的
假如我们去掉break
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1:
printf("星期一,要工作\n");
case 2:
printf("星期二,要工作\n");
case 3:
printf("星期三,要工作\n");
case 4:
printf("星期四,要工作\n");
case 5:
printf("星期五,要工作\n");
case 6:
printf("星期六,休息吧\n");
case 7:
printf("星期天,休息吧\n");
default:
printf("请确认自己输入的是数字1到7\n");
}
return 0;
}
这个时候我们输入的day假设是6
那输出的结果是什么?
是不是“星期六,休息吧”?
并不只是这样
它还会输出“星期天,休息吧”
因为case只是一个入口
告知switch程序从这开始执行
但没有告诉出口
而break就是告知的出口
加上了break
switch才不会向下继续执行
而是在break处中止
而default呢就相当于if中的else
case就相当于if
当case都不会被执行时
default才会发挥它的作用
这里的作用是提醒
2.参数
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)//day就是参数,而且是整形参数,所以数组类型也行。不过字符也可以,为什么呢?因为字符会对应ASCII表转换成整形。
{
case 1:
printf("星期一,要工作\n");
break;//case只是点明入口,如果没有break,就会一路执行下去,相当于break是出口
case 2:
printf("星期二,要工作\n");
break;
case 3:
printf("星期三,要工作\n");
break;
case 4:
printf("星期四,要工作\n");
break;
case 5:
printf("星期五,要工作\n");
break;
case 6:
printf("星期六,休息吧\n");
break;
case 7:
printf("星期天,休息吧\n");
break;
default://default相当于if语句中的else,当参数没有可执行的case时,就可以执行。
printf("请确认自己输入的是数字1到7\n");
}
return 0;
}
这里的day自然就是参数
这个参数是有要求的
即它得是一个整形参数
但如果day是一个字符参数
那也没有关系
因为字符会对应ASCII表转换成整形
例如‘A’就会被转换为65