分支语句和循环语句
1.分支语句
- if语句
- switch语句
2.循环语句
- while语句
- for语句
- do while语句
3.goto语句
今天我们更加细致的学习一下语句
1. 什么是语句?
C语言语句可分为以下五类:
- 表达式语句
- 函数调用语句
- 控制语句
- 复合语句
- 空语句
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> int main() { 3 + 5;//表达式语句 printf("hello\n");//函数调用语句 ;//空语句 return 0; }
大部分情况下,用分号结尾的就是一条语句
今天我们学习的是控制语句
2. 控制语句
控制语句用于控制程序的执行流程,以实现程序的各种结构方式,由特定的语句定义符组成。
之前的文章中我们提到过:C语言是一种结构化的程序设计语言
C语言支持三种结构
- 顺序结构
- 选择结构
- 循环结构
C语言有九种控制语句,可以分为以下三类:
- 条件判断语句也叫分支语句:if语句、switch语句
- 循环执行语句:do while语句、while语句、for语句
- 转向语句:break语句、goto语句、continue语句、return语句
3. 分支语句(选择结构)
如果...否则...(这就是一个选择)
3.1 if语句
1. if语句的语法结构
语法结构:
if(表达式)
语句;
那么if语句是如何执行的呢?以上面为例
括号中的表达式为真,则执行语句;为假则不执行
在C语言中,0表示假,非0表示真(而不是只有1为真)
if语句还有下面这两种语法结构
if(表达式)
语句1;
else
语句2;
//多分支
if(表达式1)
语句1;
else if(表达式2)
语句2;
else
语句3;
同理,表达式为真执行,为假继续判断是否满足另外的表达式,判断是否执行
当判断结束后需要执行的语句大于一条的时候,可以用大括号"{ }"括起来,形成一个代码块
2. 悬空else
当你写了这个代码:
#include "stdio.h" int main(){ int a=0; int b=2; if(a==1) if(b==2) printf("hehe\n"); else printf("haha\n"); return 0; }
很多小伙伴可能认为运行结果是打印haha
实际上,他的运行结果为空
为什么呢?
事实上,这个else匹配的是离他最近的这个if,如果把else故意提到前面,那么就会很容易误导到我们
if-else:else匹配的是离他最近的if
我们能够明显感受到,代码的风格不同,阅读起来的感觉就有很大的区别
因此,我们写出良好的代码风格是非常重要的
有些小伙伴会想,那我就想让这个else匹配最前边的if,那怎么做呢
我们可以改良一下这个代码
#include"stdio.h" int main() { int a = 0; int b = 2; if (a == 1) { if (b == 2) printf("hehe\n"); } else printf("haha\n"); return 0; }
这样改一下,运行结果就是这样了
所以,我们未来在写代码的时候,一定要注意我们的代码风格
3.2 switch语句
switch语句常常用于多分支的情况
比如:
输入1,输出星期一
输入2,输出星期二
输入3,输出星期三
输入4,输出星期四
输入5,输出星期五
输入6,输出星期六
输入7,输出星期日
这样用if-else写起来太复杂,那我们就得有不一样的语法形式
这就是switch语句
1. switch语句的语法结构
switch(整型表达式)
{
语句项;
}
这个表达式只能是整型表达式
语句执行的时候,根据整型表达式的值选择对应的语句项执行
语句项是什么呢?
//是一些case语句
//如下case 整型常量表达式:
语句;
2. switch语句中的break语句
switch语句的执行逻辑是这样的,举个例子来看
int main() { int day; 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"); } return 0; }
他的运行结果是
当我们输入'5',switch根据day的值进入case5,执行case5的语句;
但是当case5的语句执行完后,并没有退出switch语句,会继续执行接下来的case6、case7;
如果我们想只执行该语句的效果,那么我们就需要使用break语句;
break语句的作用是:在switch语句中,执行完该语句项,跳出整个switch语句
我们可以改良一下这个代码
int main() { int day; scanf("%d", &day); switch (day) { case 1: printf("星期一\n"); 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; } return 0; }
这下他的运行结果就是这样了
加入break,才能实现switch语句的分支效果
case仅仅决定他的入口
3. switch语句中的default
default用在switch语法中,如果没有在case 1/2/3/xxx范围内,则执行default,这个思路是为了保险,为了程序少出bug
default是最后一种可能,所以不用再加 break
4. 循环语句
循环结构由三个要素组成,分别为循环变量、循环体和循环终止条件。
- 循环结构:也称为重复结构,程序中反复执行的一组指令或程序段
- 循环体:被反复执行的程序段
- 循环变量:用来控制循环是否继续进行的变量
常见的循环结构有三种,为for循环,while循环,以及do while循环。
4.1 while循环
1. while语句的语法结构
while(表达式)
循环语句;
2. 循环执行步骤
- 先进行循环控制变量初始化(在while之前)
- 判断循环终止条件,如果判断结果为真,则进入第三步;如果为假则不执行循环体
- 执行循环体
- 执行循环控制变量增量,转入第二步
3. continue在while循环中的作用
continue是用于终止本次循环,也就是本次循环中continue后面的代码不会再执行,而是直接跳转到while语句的判断部分,进行下一次循环的入口判断
4.2 for循环
1. for语句的语法结构
for(表达式1;表达式2;表达式3)
循环语句;
- 表达式1是初始化部分
- 表达式2是判断部分
- 表达式3是调整部分
如果省略了判断部分,那说明判断部分恒为真,即
for(表达式1;;表达式3)
循环语句;
2. 循环执行步骤
- 先进行循环控制变量初始化
- 执行循环终止条件,如果判断结果为真,则进入第三步;如果为假则循环终止并退出
- 执行循环体
- 执行循环控制变量增量,转入第二步
4.3 do while循环
1. do while语句的语法结构
do
循环语句;
while(表达式);
2. 循环执行步骤
- 先进行循环控制变量初始化(在do while之前)
- 执行循环体
- 执行循环控制变量增量
- 判断循环终止条件,如果判断结果为真,则返回第二步;如果为假则直接退出循环
3. do while循环中的continue
do while中的break和continue与while循环中的作用一模一样
break都是用于终止循环
continue都是跳过本次循环后边的代码,直接去判断部分
4.4 小总结
简单来说,while循环和for循环都是先判断表达式,后执行循环体(本质上没太大差别);
而do while循环是先执行循环体后判断表达式
5. 结束
那么今天的学习就到这里咯,今天我们更深入的剖析了五种语句的知识
小杜跟各位小伙伴在一起成长,祝我们都能成为大牛!
//小杜的成长之路