目录
引言
C语言是结构化的程序设计语言,而在C语言中结构分为顺序结构、选择结构、循环结构,我们日常生活中方方面面的事情拆分为这三种结构或者这三种结构的结合。我们可以使用if、switch语句来实现选择结构,使用 for、while、do while 来实现循环结构,下面就让我们一起来开始C语言分支与循环的学习。
Part1 选择结构
1.1 if 语句
if 语句
假如你想让计算机来帮我们判断一个整数是否为奇数,并当我们输入的数为奇数时并得到肯定,我们该如何做呢?在这里我们就可以使用if语句来实现这种功能,首先我们来看if语句的基本语法:
if(表达式)
语句;
我们使用if语句很容易就完成了上述的需求,并得到了正确的结果
#include <stdio.h>
int main(){
//定义一个整数变量num并为它初始化为0
int num = 0;
//输入一个数字
printf("请输入一个数字:\n");
scanf("%d", & num);
//使用if语句实现对奇数的判断
if (num % 2 == 1)
printf("这个数字是奇数\n");
return 0;
}
if-else 语句
此时问题又出现了,如果我们想在上述条件的基础上,让这个程序能够判断偶数怎么办呢?那么我们就可以使用if-else语句来实现这种功能,if-else 语句的语法格式如下
if(表达式)
语句1;
else
语句2;
下面我们就加入 if-else 语句修改上述代码并可以得到我们想要的结果
#include <stdio.h>
int main(){
//定义一个整数变量num并为它初始化为0
int num = 0;
//输入一个数字
printf("请输入一个数字:\n");
scanf("%d", & num);
//使用if语句实现对奇数的判断
if (num % 2 == 1)
printf("这个数字是奇数\n");
//加入else语句实现对偶数的判断
else
printf("这个数字是偶数\n");
return 0;
}
if 语句中包含多条语句的情况
我们不难发现,在上述我们介绍的两种语句中,无论是 if 语句还是 if-else 语句中,if 和 else 都只能控制一条语句,但是当我们解决复杂的问题的时候,if 或 else 中可能存在着多条语句,那么我们就可以使用{ }来控制多条语句
if-else if-else 语句(嵌套if)
在if语句中 else 还可以加入另一个if构成 else if 语句来构成多重循环,下面我们来举一个例子:输入一个整数,并判断这个数是0,还是正数或负数
我们使用 if-else if-else 语句就可以很容易的实现它,并得到我们想要的结果
#include <stdio.h>
int main()
{
//定义一个整数变量num并为它初始化为0
int num = 0;
//输入一个整数
printf("请输入一个整数:\n");
scanf("%d",&num);
//使用if-else if-else语句构造多重判断来实现对整数的判断
if (num == 0)
printf("输入的整数为0\n");
else if (num > 0)
printf("输入的整数为正数\n");
else
printf("输入的整数为负数\n");
return 0;
}
但是在这里我们需要注意的一点是,else 通常只跟最接近的 if 匹配,下面我们可以举一个例子来解释这种情况
#include <stdio.h>
int main()
{
//定义一个整数a ,b
int a = 1;
int b = 0;
if (a == 0)
if (b == 0)
printf("hehe\n");
else
printf("haha\n");
return 0;
}
我们来分析一下上面的代码,究竟打印hehe还是haha呢?事实是:当这段代码运行后什么也不打印,这就验证了上面说到的 else 通常只跟最接近的 if 匹配,上⾯代码的排版,让 else 和第⼀个 if 语句对⻬,使我们以为 else 是和第⼀个if匹配的,当第一个 if 语句不成⽴的时候,那么我们⾃然就会想到的就是执⾏ else ⼦句,打印 haha ,但是实际上 else 是和第⼆个 if 进⾏匹配的,这样一来后边的 if...else 语句是嵌套在第⼀个 if 语句中的,当第⼀个 if 语句不成⽴,嵌套 if-else 语句就更没有机会执⾏了,最终当我们运行这段代码后啥都不打印。当然我们也可以对该代码进行合适的调整,这样就可以让我们一目了然看出 else 是和哪一个 if 匹配的了。
#include <stdio.h>
int main()
{
//定义一个整数a ,b
int a = 1;
int b = 0;
if (a == 0)
if (b == 0)
printf("hehe\n");
else
printf("haha\n");
return 0;
}
1.2 switch 语句
在C语言中,除了if语句我们还可以使用switch语句来实现分支结构,switch语句我们可以理解为一种特殊的if-else语句形式,用于判断条件有多个结果的情况,switch语句的语法格式如下
switch(表达式){
case value1:语句1
case value2: 语句2
case value3:语句3
……
default:语句 ……
}
下面我们举一个实例来为大家展示switch语句的功能:
实例:在键盘输入⼀个1~7之间的数字,打印输出对应的星期几
输入:1 输出:今天是星期⼀
输入:2 输出:今天是星期⼆
输入:3 输出:今天是星期三
输入:4 输出:今天是星期四
输入:5 输出:今天是星期五
输入:6 输出:今天是星期六
输入:7 输出:今天是星期天
当输入其他的整数数字,输出:请输入正确的数字!!!
#include <stdio.h>
int main() {
//定义一个整数变量day并为它初始化为0
int day = 0;
//输入一个整数day
printf("请输入一个整数:\n");
scanf("%d", &day);
switch (day) {
//输入:1 输出:今天是星期一
case 1:
printf("今天是星期一\n");
break;
//输入:2 输出:今天是星期⼆
case 2:
printf("今天是星期二\n");
break;
//输入:3 输出:今天是星期三
case 3:
printf("今天是星期三\n");
break;
//输入:4 输出:今天是星期四
case 4:
printf("今天是星期四\n");
break;
//输入:5 输出:今天是星期五
case 5:
printf("今天是星期五\n");
break;
//输入:6 输出:今天是星期六
case 6:
printf("今天是星期六\n");
break;
//输入:7 输出:今天是星期天
case 7:
printf("今天是星期日\n");
break;
//使用default语句规避错误的输入
default:
printf("请输入正确的数字!!!\n");
}
return 0;
}
我们可以看见在 switch 语句中我们还加入了 break 语句 ,这是因为 switch 语句也是分⽀效果的,只有在 switch 语句中使用 break语句 才能跳出 switch 语句后续的判断,如果我们不加入 break 语句,代码会继续往下执行其他的case分支,直至 switch 语句结束
在这里我们重点强调几点:
1、当 switch 语句中表达式运行得出不同的值时,执行对应 case 分支 value 值相同的语句,如果所有的 case 值都不能满足表达式对应的值时,则执行 default 中的语句
2、switch 后的表达式必须是整形表达式,case 分支后的 value 值,必须是整形常量表达式
3、switch 语句中 case 语句和 default 语句是没有顺序要求的,我们可以按照我们实际需求来设置case 语句和 default 语句的顺序,通常我们会把 default 语句放在最后
Part2 循环结构
2.1 break 和 continue 语句
在循环执行的过程中,有时候我们会遇到某种状况的发生,从而导致我们不得不提前终止循环,在C语言中为我们提供了break 和 continue 两个关键字,下面就让我们来说明一下 break 和 continue两个关键字的作用吧
break
break的作用就是永久的终止循环,当 break 语句被执行,就会直接跳出循环结构,继续执行循环结构后面的语句
continue
continue的作用是跳出本次循环中 continue 后面的代码,从而进行下一轮的循环,而 continue 在 for 循环和while、do-while 循环中也有所不同
2.2 for 循环
for 循环是我们在循环结构中运用最多的一种循环,for 循环的语法格式如下:
for(表达式1;表达式2;表达式3){
语句;
}
我们不难发现,诶?for 循环中怎么会有三个表达式呢?这三个表达式分别具有不同的作用,下面就让我来为大家详细的说明一下 for 循环的执行流程以及 for 循环中三个表达式的作用吧
当我们执行for循环的时候,首先执行表达式1,表达式1用于对循环变量初始化,接着执行表达式2,表达式2用于对循环结束条件的判断,当循环结束条件==0时,则 for 循环结束,当循环结束条件!=0时,则执行 for 循环中的语句,当循环语句执行完后,执行表达式3,表达式3用于对循环变量的调整,调整完循环变量后,再继续执行表达式2,判断循环结束条件,若循环结束条件依然!=0,那么继续执行循环语句,当循环语句执行完后,执行表达式3,依次循环;若循环结束条件==0,则直接跳出 for 循环
下面我们可以举一个实例来为大家更清楚地展示for循环的作用
实例:
2.3 while 循环
while 语句和 if 语句的语法形式非常相似,while 语句的语法格式如下:
while(表达式)
语句;
我们可以再用一张流程图来为大家说明一下 while 循环的执行流程,当我们进入 while 循环后首先先判断表达式,当表达式的值不为0(表达式为真)时,执行 while 循环里面的语句,当语句执行完后,再判断表达式,当表达式的值不为0(表达式为真)时,继续执行 while 循环里面的语句,再进行表达式判断,直到当表达式值为0时,跳出 while 循环,循环结束
下面我们通过一个实例来为大家展示 while循环的作用:
输⼊⼀个正的整数,逆序打印这个整数的每⼀位
例如: 输入:1234,输出:4321
输入:521,输出:125
我们在这里简要的分析一下,要想逆序打印一个正整数的每一位我们应该从最低位开始算,我们可以用%10,例如上面的1234,我们可以用1234%10得到4,接着那么我们想要去掉4用123来运算得到123的最低位,我们就可以用到/10来得到123,接着我们依次循环这两个步骤就可以逆序打印一个正整数的每一位了
#include <stdio.h>
int main() {
//定义一个整形变量num用来输入正整数,把它初始化为0
int num = 0;
//输入一个整数num
printf("请输入一个正整数:\n");
scanf("%d", &num);
printf("该整数逆序打印出来为:\n");
//使用while循环将整数逆序打印出来
while (num) {
//用%10运算得到最低位数字
printf("%d \n",num % 10);
//用/10运算将最低位数字去除
num = num / 10;
}
return 0;
}
2.4 do-while 循环
for 和 while 这两种循环结果都是先判断表达式条件,条件如果满足就进入循环,执行循环语句,如果不满足就跳出循环;下面我们就为大家带来一种先执行循环语句,再进行表达式判断的循环结构—— do-while 循环,下面我们就来看看它的语法格式吧
do
语句;
while(表达式);
根据 do-while循环的语法格式,和while循环一样我们通过一个流程图来为大家说明 do- while 循环的执行流程,在 do-while 循环中先执行下图中的语句,当执行完语句后,再去执行判断表达式,当判断表达式的结果!=0,则继续执行循环语句;当判断表达式的结果==0,则循环结束。 所以我们可以得出一个结论:do-while循环的循环语句(循环体)至少循环一次。
下面我们通过一个实例来为大家展示 do-while循环的作用:
实例:键盘输入一个整数,计算这个整数是几位数
例如:输入:1234 输出:4
我们在这里简要分析一下,如果想要得到一个整数的位数时,我们可以用到/10运算统计这个整数的位数,并且do-while 循环是先执行循环体,可以完美符合这个练习的需求,我们定义一个整形变量count,用来计算/10运算的次数,每进行一次运算,变量count就记一次数,当这个整数无法被出时,结束循环,得到的整形变量count就是这个整数的位数
#include <stdio.h>
int main() {
//定义一个整形变量n用来输入整数,并把它初始化为0
int n = 0;
//输入一个整数n
printf("请输入一个整数:\n");
scanf("%d", &n);
//使用do-while循环判断这个整数是几位数
//定义一个整形变量count用来计数,并把它初始化为0
int count = 0;
do
{
//每进行一次/10运算,count记一次数
count++;
n = n / 10;
} while (n);
printf("这个整数是%d位数\n", count);
return 0;
}
goto语句
在C语言中为我们提供了一种非常特殊的语法,它就是 goto 语句和跳转标号,goto语句可以实现在同一个函数内跳转到设置好的跳转标号处,下面我们通过一个实例来为大家更详细的说明一下goto语句的作用
下面一段代码展示了博主最喜欢的一首R&B里的歌词,正常来说应该是按顺序来打印出来的
#include <stdio.h>
int main() {
printf("唉 为何你的秘密不删\n");
printf("唉 现在已经麻痹无感\n");
printf("到底是怎样 别问很可怕\n");
return 0;
}
现在我希望直接打印第一句和第三句歌词,这时我们就可以使用goto语句和跳转标号直接跳转到第三句歌词,修改完的代码如下
#include <stdio.h>
int main() {
printf("唉 为何你的秘密不删\n");
//使用goto 语句和跳转标号直接跳到第三句歌词
goto next;
printf("唉 现在已经麻痹无感\n");
next:
printf("到底是怎样 别问很可怕\n");
return 0;
}
分支和循环中涉及的操作符
1、关系操作符
我们知道在C语言中有许多用来比较的表达式,而其中所使用到的运算符我们就称之为关系操作符,下面我们就通过分支与循环语句将比较常用的关系操作符来为大家来展示其作用
实例:我们编写一个程序可以输入一个人的年龄并进行下面的判断:
如果年龄=0岁,打印"你还没出生呢"
如果年龄<18岁,打印"你是少年"
如果年龄在18岁⾄44岁之间打印"你是⻘年"
如果年龄在45岁⾄59岁打印"你是中年"
如果年龄在60岁⾄89岁打印"您是⽼年"
如果90岁以上打印"您已经是⽼寿星了!!!"
#include <stdio.h>
int main()
{
//定义一个整数变量age并为它初始化为0
int age = 0;
//输入一个整数年龄age
printf("请输入年龄:\n");
scanf("%d", &age);
//使用使用==(相等运算符) <(小于运算符) , <=(小于等于运算符) 和>=(大于等于运算符)关系操作符构成语句
// 并使用嵌套if-if else-else语句来进行判断
if (age == 0 ) {
//如果年龄=0岁,打印"你还没出生呢"
printf("你还没出生呢\n");
}
else
{
//如果年龄<18岁,打印"你还是少年"
if (age > 0 && age < 18)
{
printf("你是少年\n");
}
else
{
//如果年龄在18岁⾄44岁之间打印"你是⻘年"
if (age >= 18 && age <= 44)
{
printf("你是青年\n");
}
else
{
//如果年龄在45岁⾄59岁打印"你是中年"
if (age >= 45 && age <= 59)
{
printf("你是中年\n");
}
else
{
//如果年龄在60岁⾄89岁打印"您是⽼年"
if (age >= 60 && age <= 89)
{
printf("您是老年\n");
}
else
//如果90岁以上打印"您已经是⽼寿星了!!!"
printf("您已经是老寿星了!!!\n");
}
}
}
}
return 0;
}
在上面实例中,我已经为大家展示了常见的关系操作符在实际情况中是怎么样使用的了,相信大家也很容易就可以看懂,但是在这里我需要为大家强调的一点是:多个关系操作符不宜连用
2、条件操作符
条件操作符也叫三目操作符,其形式如下:
表达式1?表达式2:表达式3
我们在这里来解释一下条件操作符的形式,当我们使用条件操作符的时候,先执行表达式1,若表达式1执行结果为真,那么执行表达式2,且表达式2的结果为整个表达式的结果,若表达式1执行结果为假,则执行表达式3,且表达式3的结果为整个表达式的结果
3、逻辑操作符
逻辑操作符与&&
&& 是逻辑操作符与,也就是并且的意思, && 是⼀个双⽬操作符,使⽤的⽅式通常是 a&&b , 只有&& 两边的表达式都是真的时候,整个表达式才为真,只要有⼀个是假,则整个表达式为假。我们可以总结为全真为真,一假则假
逻辑操作符或||
|| 是逻辑运算符或,也就是或者的意思, || 也是⼀个双⽬操作符,使⽤的⽅式是 a || b , || 两边的表达式只要有⼀个是真,整个表达式就是真,两边的表达式都为假的时候,才为假。我们也可以总结为一真为真,全假为假
逻辑操作符非!
! 是逻辑运算符非,我们可以理解为按位取反的意思,使用的方式是!a(a是一个表达式,用来改变单个表达式的真假)
下面我们可以举一个实例来为大家更清楚地展示逻辑操作符的作用
实例:键盘输入一个年份,判断这个年份是否是闰年
闰年的判断条件是:
1、能被4整除并且不能被100整除
2、能被400整除
我们在这里简要分析一下闰年的判断条件,第一是能被4整除并且不能被100整除,这里我们很明显可以知道需要能被4整除和不能被100整除这两个条件同时成立,所以我们可以使用逻辑运算符与&&将这两个条件连接起来,第二是能被400整除,而这两个条件不需要同时成立,二者有一个成立就可以判断年份是否为闰年了,我们可以把两个判断条件用逻辑操作符或||连接起来
#include <stdio.h>
int main() {
//定义一个整数变量year并为它初始化为0
int year = 0;
//输入一个整数年份year
printf("请输入年份:\n");
scanf("%d", &year);
/*闰年的判断条件:
1、能被4整除并且不能被100整除 使用逻辑运算符与&&连接这两个条件
2、能被400整除
使用逻辑运算符或||将条件1、2连接起来
*/
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
{
printf("该年份是闰年\n");
}
else
printf("该年份不是闰年\n");
return 0;
}