👦个人主页:Weraphael
✍🏻作者简介:目前正在回炉重造C语言(2023暑假)
✈️专栏:【C语言航路】
🐋 希望大家多多支持,咱一起进步!😁
如果文章对你有帮助的话
欢迎 评论💬 点赞👍🏻 收藏 📂 加关注😍
目录
一、什么是语句
C语言可分为以下五类:
- 表达式语句
- 函数调用语句
- 控制语句
- 复合语句
- 空语句
本章介绍的是控制语句。
控制语句用于控制程序的执行流程,以实现程序的各种结构方式(C语言支持三种结构:顺序结构、选择结构、循环结构),它们由特定的语句定义组成,C语言有九种控制语句。
可分为以下三类:
- 条件判断语句(分支语句):
if
、switch
- 循环执行语句:
do while
、while
、for
- 转向语句:
break
、goto
、continue
、return
二、if语句
2.1 if语法结构
1.单分支
//表达式结果为真,语句就被执行
if(表达式)
语句;
2.双分支
if (表达式1)
语句;
else
语句2;
3. 多分支
if(表达式1)
语句1;
else if(表达式2)
语句2;
else
语句3;
【代码样例】
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if (age < 16)
printf("少年\n");
else if (age >= 16 && age < 30)
printf("青年\n");
else if (age >= 30 && age < 40)
printf("中年\n");
else if (age >= 40 && age < 56)
printf("壮年\n");
else if (age >= 56 && age < 80)
printf("老年\n");
else
{
printf("老寿星\n");
printf("身体健康\n");
}
return 0;
}
代码解析:if
和else
语句默认只会执行一条语句,如果需要执行多条语句需要加代码块{}
。
2.2 悬空else
以下结果是多少?
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
if (a == 1)
if (b == 2)
printf("666\n");
else
printf("6\n");
return 0;
}
答案是不输出!原因是:else
是与最近的if
匹配的。
三、练习
3.1 判断一个数是否是奇数
#include <stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
// 奇数是除2余1
if (num % 2 == 1)
printf("%d是奇数\n", num);
else
printf("%d不是奇数\n", num);
return 0;
}
3.2 输出1~100之间的奇数
#include <stdio.h>
int main()
{
int i = 1;
while (i <= 100)
{
if (i % 2 == 1)
printf("%d ", i);
i++;
}
return 0;
}
四、switch语句
switch
语句也是一种分支,常常用于多分支的情况。
比如,写个输入一显示星期一,输入二显示星期二。以此类推…
#include <stdio.h>
int main()
{
int day = 0;
scanf("%d", &day);
if (day == 1)
printf("Monday\n");
else if (day == 2)
printf("Tuesdy\n");
else if (day == 3)
printf("Wednesday\n");
else if (day == 4)
printf("Thursday\n");
else if (day == 5)
printf("Friday\n");
else if (day == 6)
printf("Saturday\n");
else if (day == 7)
printf("Sunday\n");
else
printf("输入错误\n");
return 0;
}
用
if
和else
也能实现这个场景,但这样写下去有没有发现很长且非常麻烦,所以这里我们可以用switch
语句。
【语法形式】
// 其中,整型表达式也包括char类型,
// 虽然char为字符类型,但字符的存储是ASCII码值是整数
// 所以char也是整型家族。
switch(整型表达式)
{
//case和整型常量表达式中间要有空格
case 整型常量表达式:
语句项;
}
#include <stdio.h>
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1:
printf("Monday\n");
break;
case 2:
printf("Tuesday\n");
break;
case 3:
printf("Wednesday\n");
break;
case 4:
printf("Thursday\n");
break;
case 5:
printf("Friday\n");
break;
case 6:
printf("Saturday\n");
break;
case 7:
printf("Sunday\n");
break;
default:
printf("输入错误\n");
break;
}
return 0;
}
在这里,我想说
case
只决定程序的入口
,如果没有break
作为出口
,就会一直往后打印,直到程序结束。当所有的case
都不能匹配的时候,还要处理不能匹配的情况,这时就引入了default
。当然,default
也可以放在switch
中任何地方,但后面要加上break
。如果default
放在最后,break
可以不写。 但不是每次写完语句项都要跟上break
,这要根据实际情况而定。
【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;
}
case 4:
m++;
break;
default:
break;
}
printf("m=%d,n=%d\n", m, n);
return 0;
}
【详解】
#include <stdio.h>
int main()
{
int n = 1;
int m = 2;
switch (n)
{
case 1:
m++;
//++后,m=3
// 由于没有break继续执行
case 2:
n++;
//++后,n=2
case 3:
//switch可以嵌套使用
switch (n)
// n = 2来到case 2
{
case 1:
n++;
case 2:
m++;
n++;
//m和n++后分别是
//m=4,n=3
break;
//break结束的是嵌套的switch
}
case 4:
m++;
// ++后m=5
break;
// break结束
default:
break;
}
printf("m=%d,n=%d\n", m, n);
// 因此最后m=5,n=3
return 0;
}
五、循环语句
5.1 while循环
【语法结构】
//表达式为真,则执行循环语句。
while(表达式)
{
循环语句;
}
执行流程:如果表达式为真,就执行循环语句,然后又会跳到表达式判断是否为真,直到表达式为假,则循环停止。
【代码样例】
打印1~10
#include <stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
printf("%d ", i);
i++;
}
return 0;
}
5.1.1 while中的break
#include <stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 2)
{
break;
}
printf("%d ", i);
i++;
}
return 0;
}
执行流程:当
i = 1
满足条件进入循环,不满足if
语句,因此打印1
,然后i
自增为2
;又满足循环条件,此时i = 2
满足if
条件执行break
语句,而break
在while
中的作用:break
只要被执行,不管后面有多少循环,程序直接永远终止循环。 所以程序最后的结果为1
。
【程序结果】
5.1.2 while中的continue
#include <stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 2)
{
continue;
}
printf("%d ", i);
i++;
}
return 0;
}
执行流程:当
i = 1
满足条件进入循环,不满足if
语句,因此打印1
,然后i
自增到2;i
又满足循环条件,此时i = 2
满足if
条件执行continue
语句。而continue
在while
的作用是:终止本次循环,也就是本次循环continue
后边的代码不会执行,而是跳转到while
语句的判断部分,进行下一次循环的入口判断。 因此以上代码最后打印1
,并且光标一直闪烁。
【程序结果】
5.2 for循环
【语法结构】
for(表达式1;表达式2;表达式3)
{
循环语句;
}
//表达式1为初始化部分,用于初始化循环变量的。
//表达式2为条件判断部分,用于判断循环时候终止的。
//表达式3为调整部分,用于循环条件的调整。
【代码样例】
输出1~10
#include <stdio.h>
int main()
{
for (int i = 1; i <= 10; i++)
{
printf("%d ", i);
}
printf("\n");
return 0;
}
5.2.1 for循环中的break
#include <stdio.h>
int main()
{
for (int i = 1; i <= 10; i++)
{
if (i == 2)
{
break;
}
printf("%d ", i);
}
return 0;
}
【程序结果】
我们发现在for循环中,break
的意义和在while
循环是一样的,break
只要被执行,不管后面有多少循环,程序直接永远终止循环。
5.2.2 for循环中的continue
#include <stdio.h>
int main()
{
for (int i = 1; i <= 10; i++)
{
if (i == 2)
{
continue;
}
printf("%d ", i);
}
return 0;
}
【程序结果】
continue
和while
循环还是略有差异的,这就要涉及for
循环的执行顺序,当第一轮循环结束后,会执行调整部分i++
。所以会完整打印1~10
5.2.3 for的变种
1. 省略初始化部分,条件判断部分和调整部分
其实程序死循环了。因为省略了判断部分,导致判断一直都为真。
总结:for
循环的初始化,判断和调整三个部分都可以省略,但是省略判断部分,判断恒为真,循环就死循环。
2. 省略初始化部分
#include <stdio.h>
int main()
{
int i = 0;
int j = 0;
for (; i < 3; i++)
{
for (; j < 3; j++)
{
printf("hello world\n");
}
}
return 0;
}
【程序结果】
【代码解析】
首先一开始i = 0
,满足循环条件,进入循环,j = 0
且满足内部循环,打印第一个hello world
,接着j++
使得j = 1
,又满足内部循环条件,再打印第二个hello world
,接着j++
使得j = 2
,又满足内部循环条件,再打印第三个hello world
,接着j++
,导致j = 3
为假,跳出内部循环循环,此时外部循环i++
,使得i = 1
,再次进入内部循环,但此时j
没有被初始化,j
还是等于3为假跳出循环,以此类推。最后只打印3个hello world
。
3. 使用多于一个变量控制循环
#include <stdio.h>
int main()
{
for (int x = 0, y = 0; x < 2 && y < 5; x++, y++)
{
printf("hello world\n");
}
return 0;
}
【程序结果】
5.3 do while循环
【语法结构】
do 循环语句 while(表达式);
特点:循环至少执行一次,使用场景有限,所以不经常使用。
for
>while
>do while
【代码样例】
打印1~10
#include <stdio.h>
int main()
{
int i = 0;
do
{
i++;
printf("%d ", i);
} while (i < 10);
return 0;
}
while
是先判断再执行,而do while
是必须先执行do
里的语句,再判断。
5.3.1 do while中的break
#include <stdio.h>
int main()
{
int i = 0;
do
{
i++;
printf("%d ", i);
if (i == 2)
{
break;
}
} while (i < 10);
return 0;
}
【程序结果】
break
只要被执行,不管后面有多少循环,程序直接永远终止循环。
5.3.2 do while中的continue
#include <stdio.h>
int main()
{
int i = 0;
do
{
i++;
printf("%d ", i);
if (i == 2)
{
continue;
}
} while (i < 10);
return 0;
}
【程序结果】