目录
1. 什么是语句?
C语句可分为以下五类:
- 表达式语句
- 函数调用语句
- 控制语句
- 复合语句
- 空语句
其中,控制语句用于控制程序的执行流程,以实现程序的各种结构方式,它们由特定的语句定义符组成,C语言有九种控制语句。
可分为以下三类:
-
条件判断语句(分支语句)
- if 语句
- switch 语句
-
循环执行语句
- while 语句
- for 语句
- do while 语句
-
转向语句
- break 语句
- continue 语句
- return 语句
- goto 语句
2. 分支语句
通过对给定的条件进行判断,来决定执行两个分支或多个分支中的哪一支。因此,在编写之前,要先明确判断条件是什么,并确定当判断结果为”真“或”假“时应分别执行什么操作(算法)。
0表示假,非0表示真。
2.1 if 语句
语法结构:
//单分支
if (表达式)
语句;
//双分支
if (表达式)
语句1;
else
语句2;
//多分支
if (表达式1)
语句1;
else if (表达式2)
语句2;
else
语句3;
举例:
#include <stdio.h>
//代码1
int main()
{
int age = 0;
scanf("%d", &age);
if (age < 18)
{
printf("未成年\n");
}
return 0;
}
//代码2
int main()
{
int age = 0;
scanf("%d", &age);
if (age < 18)
{
printf("未成年\n");
}
else
{
printf("成年\n");
}
return 0;
}
//代码3
int main()
{
int age = 0;
scanf("%d", &age);
if (age < 18)
{
printf("少年\n");
}
else if (age >= 18 && age < 30)
{
printf("青年\n");
}
else if (age >= 30 && age < 50)
{
printf("中年\n");
}
else if (age >= 50 && age < 80)
{
printf("老年\n");
}
else
{
printf("老寿星\n");
}
return 0;
}
运行结果:
代码1:
![image-20230504212038357](https://i-blog.csdnimg.cn/blog_migrate/3f559b1b2142fb20605c2307a9aca8ef.png)
代码2:
![image-20230504212209664](https://i-blog.csdnimg.cn/blog_migrate/96c67a68fa6541e9d178d6143cf65cde.png)
代码3:
![image-20230504212402082](https://i-blog.csdnimg.cn/blog_migrate/279a85d7799face3569097df9c6c3a82.png)
2.1.1 悬空 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;
}
运行结果:
![image-20230504212553654](https://i-blog.csdnimg.cn/blog_migrate/6814a93233714909198303848fbd5857.png)
改正:
#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;
}
运行结果:
![image-20230504212730485](https://i-blog.csdnimg.cn/blog_migrate/5808b9c40a2c540d1502491d13103926.png)
else
的匹配:else
是和它离的最近的if
匹配的。
通过对比,可以看出:适当的使用{}
可以使代码的逻辑更加清楚。
所以说,代码风格很重要。
2.1.2 if 书写形式的对比
//代码1
if (condition)
{
return x;
}
return y;
//代码2
if (condition)
{
return x;
}
else
{
return y;
}
//代码3
int num = 1;
if (num == 5)
{
printf("hehe\n");
}
//代码4
int num = 1;
if (5 == num)
{
printf("hehe\n");
}
其中,代码2和代码4更好,逻辑更加清晰,不容易出错。
2.2 switch 语句
switch
语句常常用于多分支的情况。
语法结构:
switch (整型表达式)
{
语句项;
}
语句项: 是一些case语句。
case 整型常量表达式:
语句;
2.2.1 switch 语句中的 break
在switch
语句中,我们没办法直接实现分支,搭配break
使用才能实现真正的分支。
举例:
#include <stdio.h>
int main()
{
int day = 0;
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;
}
运行结果:
![image-20230504212912902](https://i-blog.csdnimg.cn/blog_migrate/26df11fca8c12688eff50388e49c7e3e.png)
有时候我们的需求变了:
1.输入1-5,输出的是“weekday”;
2.输入6-7,输出“weekend”。
所以我们的代码就应该这样实现了:
#include <stdio.h>
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("weekday\n");
break;
case 6:
case 7:
printf("weekend\n");
break;
}
return 0;
}
运行结果:
![image-20230504213018266](https://i-blog.csdnimg.cn/blog_migrate/bdc2e559290112c10b643a3ce6bf9e42.png)
break
语句 的实际效果是把语句列表划分为不同的分支部分。
编程好习惯
在最后一个
case
语句的后面加上一条break
语句。
2.2.2 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("weekday\n");
break;
case 6:
case 7:
printf("weekend\n");
break;
default:
printf("输入错误\n");
break;
}
return 0;
}
运行结果:
![image-20230504213253358](https://i-blog.csdnimg.cn/blog_migrate/9a3c0e71f7b523730bf2e89465c02ac8.png)
当switch
表达式的值并不匹配所有case
标签的值时,这个default
子句后面的语句就会执行。
所以,每个switch
语句中只能出现一条default
子句。
default
子句可以出现在语句列表的任何位置。
编程好习惯
在每个
switch
语句中都放一条default
子句是个好习惯,甚至可以在后边再加一个break
。
3. 循环语句
3.1 while 循环
语法结构:
while (表达式)
循环语句;
while 语句的执行流程图:
![while 语句的执行流程图](https://i-blog.csdnimg.cn/blog_migrate/984fdf39bc4be9b058cfc97d44b893b5.png)
举例:
#include <stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
printf("%d ", i);
i++;
}
return 0;
}
运行结果:
![image-20230504214605579](https://i-blog.csdnimg.cn/blog_migrate/ecf7b744b4309675277842730ac3293d.png)
3.1.1 while 语句中的 break
举例:
#include <stdio.h>
//break 代码实例
int main()
{
int i = 1;
while (i <= 10)
{
if (5 == i)
break;
printf("%d ", i);
i++;
}
return 0;
}
运行结果:
![image-20230504213642566](https://i-blog.csdnimg.cn/blog_migrate/0deca3e77311adc82b4fec470f754e96.png)
总结:
break
在while
循环中的作用:永久终止循环。
3.1.2 while 语句中的 continue
举例:
#include <stdio.h>
//continue 代码实例1
int main()
{
int i = 1;
while (i <= 10)
{
if (5 == i)
continue;
printf("%d ", i);
i++;
}
return 0;
}
//continue 代码实例2
int main()
{
int i = 1;
while (i <= 10)
{
i++;
if (5 == i)
continue;
printf("%d ", i);
}
return 0;
}
运行结果:
continue 代码实例1:
![image-20230504213844929](https://i-blog.csdnimg.cn/blog_migrate/4b03ea1de064632c161607493e59f31c.png)
continue 代码实例2:
![image-20230504213944436](https://i-blog.csdnimg.cn/blog_migrate/192b7f308ad73cdb54b576c5af17d5cf.png)
总结:
continue
在while
循环中的作用:跳过本次循环continue
后边的代码,直接跳转到循环的判断部分。
3.2 for 循环
语法结构:
for (表达式1; 表达式2; 表达式3)
循环语句;
表达式1
表达式1为初始化部分,用于初始化循环变量。
表达式2
表达式2为条件判断部分,用于判断循环什么时候终止。
表达式3
表达式3为调整部分,用于循环变量的调整。
for 语句的执行流程图:
![for 语句的执行流程图](https://i-blog.csdnimg.cn/blog_migrate/a27270a34ee44727a3ae7fbabf2166e7.png)
举例:
#include <stdio.h>
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
printf("%d ", i);
}
return 0;
}
运行结果:
![image-20230504214103576](https://i-blog.csdnimg.cn/blog_migrate/c85b1405ded6319b2a878a06a9460aee.png)
3.2.1 for 语句中的 break
举例:
#include <stdio.h>
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
if (5 == i)
break;
printf("%d ", i);
}
return 0;
}
运行结果:
![image-20230504214151308](https://i-blog.csdnimg.cn/blog_migrate/f8cdd8772d714e0a9223be5db5291f7a.png)
总结:
break
在for
循环中的作用:永久终止循环。
3.2.2 for 语句中的 continue
举例:
#include <stdio.h>
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
if (5 == i)
continue;
printf("%d ", i);
}
return 0;
}
运行结果:
![image-20230504214246359](https://i-blog.csdnimg.cn/blog_migrate/8d79d8949106ee6dea276172bddd9b5b.png)
总结:
continue
在for
循环中的作用:跳过本次循环continue
后边的代码,直接跳转到循环的调整部分。
3.3 do while 循环
语法结构:
do
循环语句;
while (表达式);
do 语句的执行流程图:
![do 语句的执行流程图](https://i-blog.csdnimg.cn/blog_migrate/3c449ddff574187131637fcb82771853.png)
特点:
循环至少执行一次。
举例:
#include <stdio.h>
int main()
{
int i = 1;
do
{
printf("%d ", i);
i++;
} while (i <= 10);
return 0;
}
运行结果:
![image-20230504214605579](https://i-blog.csdnimg.cn/blog_migrate/ecf7b744b4309675277842730ac3293d.png)
3.3.1 do 语句中的 break
举例:
#include <stdio.h>
int main()
{
int i = 1;
do
{
if (5 == i)
break;
printf("%d ", i);
i++;
} while (i <= 10);
return 0;
}
运行结果:
![image-20230504214722607](https://i-blog.csdnimg.cn/blog_migrate/8004abf3c64604878ef065281495b932.png)
总结:
break
在do while
循环中的作用:永久终止循环。
3.3.2 do 语句中的 continue
举例:
#include <stdio.h>
int main()
{
int i = 1;
do
{
if (5 == i)
continue;
printf("%d ", i);
i++;
} while (i <= 10);
return 0;
}
运行结果:
![image-20230504214847940](https://i-blog.csdnimg.cn/blog_migrate/7cf53d4443b77bbdcfea510f2c3b29dd.png)
总结:
continue
在do while
循环中的作用:跳过本次循环continue
后边的代码,直接跳转到循环的判断部分。
4. goto 语句
举例:
#include <stdio.h>
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
if (5 == i)
goto end;
printf("%d ", i);
}
end:
return 0;
}
运行结果:
![image-20230504215346068](https://i-blog.csdnimg.cn/blog_migrate/bac5635656a8bd37892f10004f5ceb16.png)
goto
语句尽量少用,因为这不利于结构化程序设计,滥用它会使程序流程无规律、可读性差。
最常见的用法是在终止程序在某些深度嵌套的结构处理过程中使用。
例如:一次跳出两层或多层循环。
这种情况使用
break
是达不到目的的,因为break
只能退出到上一层的循环。
goto
语句真正适合的场景如下:
for (...)
for (...)
{
for (...)
{
if (disaster)
goto error;
}
}
...
error:
if (disaster)
//处理错误情况