一、什么是语句?
C语言可分为下面五类:
1.表达式语句
2.调用函数语句
3.控制语句
4.复合语句
5.空语句
本次介绍的是控制语句。
控制语句用于控制程序的执行流程,以实现程序的各种结构方式,它们由特定的语句定义符组成,C语言有九种控制语句。
可分为下面三类:
1.条件判断语句也叫分支语句:if语句,switch语句;
2.循环执行语句:do while语句、while语句、for语句;
3.转向语句:break语句、goto语句、continue语句、return语句。
二、分支语句(选择结构)
1.if语句
1.1 if语句的语法结构
语法结构: if(表达式) 语句1; else 语句2; //多分支 if(表达式1) 语句1; else if(表达式2) 语句2; else 语句3;
1.2 if语句的使用示例
用双分支根据输入年龄的大小实现成年和未成年的判断:
#include<stdio.h> int main() { int age = 0; scanf("%d", &age);//输入 if (age >= 18)//判断 printf("成年"); else printf("未成年"); return 0; }
如果我们想分的更细致点,就可以使用多分支:
#include<stdio.h> int main() { int age = 0; scanf("%d", &age);//输入 if (age < 18)//判断 printf("青少年"); else if (age >= 18 && age < 30)//判断 printf("青年"); else if (age >= 30 && age < 50)//判断 printf("中年"); else if (age >= 50 && age < 80)//判断 printf("中老年"); else printf("老年"); return 0; }
注意:if 语句后面默认只能跟一条语句,如果要写多条语句,应该用大括号{}括起来。
如下图所示:
if (age < 18) { printf("青少年"); printf("好好学习"); }
1.3 悬空else
看下面一段代码:
#include<stdio.h> int main() { int a = 0; int b = 0; if (a == 1) if (b == 2) printf("hehe\n"); else printf("haha\n"); return 0; }
大家认为打印结果是什么呢?
结果应该是什么都不会打印。因为代码中的else是和第二个 if 相匹配的,并且它们合起来属于第一个 if 的一条语句,第一个 if 的判断条件都不成立,后面的肯定不会打印。
在这里有一个常见的错误就是有人看见第一 if 和else是对齐的,就误以为他们两个是相匹配的,打印结果就是haha,实际上是上述代码的风格误导了大家,由此可见好的代码风格的重要性,如果你的代码写的更加工整规范,就不会发生这种误会,可读性也会变强。
下面我们对上述代码用更好的风格写一下,大家会发现一目了然:
#include<stdio.h> int main() { int a = 0; int b = 0; if (a == 1) { if (b == 2) printf("hehe\n"); else printf("haha\n"); } return 0; }
else的匹配:else是和离它最近的 if 相匹配的。
1.4几种代码书写方式的对比
1.
如图代码1和代码2的运行结果是一样的,但是代码1的写法就很容易给人造成误解。
2.
上述第二个代码书写方式就优于第二个,因为代码1在书写时如果错误的少一个等号,编译器仍然会成功编译,但是代码2会编译报错。(如下图)所以代码2如果错误了,很容易发现错误。代码1则不行。
1.5 练习:输出1~100之间的奇数
#include<stdio.h> int main() { int i = 0; while (i <= 100)//循环判断 { if (i % 2 == 1)//判断是否为奇数 printf("%d ", i); i++; } return 0; }
2. switch语句
switch也是一种分支语句,常用于多分支的情况。
比如:输入1,输出星期一
输入2,输出星期二
输入3,输出星期三
输入4,输出星期四
输入5,输出星期五
输入6,输出星期六
输入7,输出星期日
如果我们用 if else 语句写就太复杂了,这时就要用到switch语句了。
2.1switch语句的语法结构
语法结构: switch(整型表达式) { 语句项; } //语句项就是一些case语句: case 整型常量表达式: 语句;
注意:1.switch后面括号()中的必须是整型表达式,case后面必须跟整型常量表达式 。
2.在写case 整型常量表达式:时不要忘了中间有空格和后面的冒号。
2.2switch语句中break的作用
#include<stdio.h> int main() { int day = 0; scanf("%d", &day); switch (day) { case 1: printf("星期一"); break; case 2: printf("星期二"); break; case 3: printf("星期三"); break; case 4: printf("星期四"); break; case 5: printf("星期五"); break; case 6: printf("星期六"); break; case 7: printf("星期日"); } return 0; }
运行结果示例:
代码中switch(day)是循环入口,break是出口,代表着跳出整个switch语句。
如果去掉break,输出结果就变成:
这是因为代码从入口进来后会继续执行后面的代码,去掉break后,没有及时跳出switch,继续执行完后面的代码才结束。
当然break是根据需要写的,不用每个case后面都写上break,比如我们要打印周一到周五是工作日,周六和周天是休息日,只需要在星期五和星期日后面写上break:
#include<stdio.h> int main() { int day = 0; scanf("%d", &day); switch (day) { case 1: case 2: case 3: case 4: case 5: printf("工作日"); break; case 6: case 7: printf("休息日"); break; } return 0; }
2.3 default子句
如果输入的不在1~7的范围内怎么提醒用户呢?
这时候用default子句就可以实现:
#include<stdio.h> int main() { int day = 0; scanf("%d", &day); switch (day) { case 1: case 2: case 3: case 4: case 5: printf("工作日"); break; case 6: case 7: printf("休息日"); break; default: printf("输入错误"); break; } return 0; }
运行结果示例:
default子句可以在switch语句中的任意位置使用,使用时注意后面的break要写上。
2.4练习:switch语句是可以嵌套使用的
#include<stdio.h> int main() { int n = 1; int m = 2; switch (n) { case 1: m++; case 2: n++; case 3: switch (n) {//switch的嵌套使用 case 1: n++; case 2: m++; n++; break; } case4: m++; break; default: break; } printf("m = %d,n = %d\n", m, n); return 0; }
输出的结果是什么呢?答案放在评论区。(提醒:注意break的使用)
今天就学到这里啦,未完待续。。。