C语言——分支与循环
1.if语句
2.关系操作符
3.条件操作符
4.逻辑操作符
5.switch语句
6.for循环
7.while循环
8.do-while循环
9.break和continue语句
10.循环的嵌套
11.goto语句
在本章中,我将为大家详细的介绍分支与循环,方便初学者理解
在C语言的学习中,我们可以用if语句和switch语句实现分支结构,用for语句、while语句和do-while语句实现循环语句
首先介绍的是分支结构
1. if语句
1.1 if的三种语法形式
if的语法形式有三种,具体如下:
1. if(表达式)
语句;
2. if(表达式)
语句;
else
语句;
3. if(表达式)
语句;
else if(表达式)
语句;
. .
. .
else
语句;
如果括号内的表达式成立(为真),则语句执行,反之,表达式不成立(为假),语句不执行。
在C语言中,0为假,非0为真
举例:判断一个数是奇数还是偶数
#include<stdio.h>
int main()
{
int i = 0;
scanf("%d", &i);
if (i % 2 == 0)
printf("是偶数");
else
printf("是奇数");
return 0;
}
输出结果

通过画图,我们可以知道if的执行流程
### 1.2 分支中包含多个语句
我们默认if和else都只控制一条语句,如果想让其控制两条及以上,则需要有{},如果没有{},则无论表达式为真还是假,语句2不受任何影响,仍然执行
if()
{
语句1;
语句2;
}
举例:输入一个值,看是否成年
#include<stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if (age >= 18)
{
printf("成年了\n");
printf("可以自己做主了");
}
return 0;
}
如果没有加上{},则结果
### 1.2 if的嵌套使用
在if else语句中,else可以与另一个if语句嵌套,构成多层判断
举例:判断一个数是奇数还是偶数
#include<stdio.h>
int main()
{
int i = 0;
scanf("%d", &i);
if (i > 0)
{
if (i % 2 == 0)
printf("偶数");
else
printf("奇数");
}
else
{
printf("不是正数");
}
return 0;
}

1.3 悬空else问题
如果有多个if和else,else都会与离得最近的if匹配
举例:
#include<stdio.h>
int main()
{
int a = 0;
int b = 2;
scanf("%d", &a);
if (a == 1)
if (b == 2)
printf("hehe\n");
else
printf("hello\n");
return 0;
}
在这段代码中,很多人容易被误导,认为第一个if和else位置对应,但实际不是这样,在这段代码中,如果a不等于1时,则什么都不会输出,

这段代码如果改为以下的,我们将会更好理解
#include<stdio.h>
int main()
{
int a = 0;
int b = 2;
scanf("%d", &a);
if (a == 1)
{
if (b == 2)
printf("hehe\n");
else
printf("hello\n");
}
return 0;
}
因此,我们可以知道,如果有多个if和else,else都会与离得最近的上一个if匹配
2. 关系操作符
C语言用于比较的表达式,称为关系表达式,里面的运算符叫关系运算符
以下为6个关系运算符
> 大于运算符
< 小于运算符
<= 小于等于运算符
>= 大于等于运算符
== 相等运算符
!= 不相等运算符
关系表达式通常返回0或1,表示真假
关系表达式常用于if和while结构
注意
- ==相等运算符和=赋值运算符不同,当我们输错时,程序可能仍会执行,但结果可能不同
- 不能将多个关系运算符连用,例如(i < j < k),这个就是错误的,如果要改为正确的,则应为(i < j && j < k)
3. 条件操作符
条件操作符也叫三目操作符,需要接受三个操作数,形式如下
exp1 ? exp2 : exp3;
此条件操作符的计算逻辑是:如果 exp1 为真,则exp2计算;如果exp1为假,则exp3计算

在此代码中,我们可以看到(2>8)这个表达式不成立,则输出的为后一个,否则输出的为前一个
4. 逻辑操作符:&&,||,!
逻辑运算符提供逻辑判断功能,用于构建更复杂的表达式,主要有三个运算符
!:逻辑取反运算符(改变单个表达式的真假)
&&:逻辑与运算符,就是并且的意思(两侧的表达式为真时,才为真,否则为假)
||:逻辑或运算符,就是或者的意思(两侧至少有一个表达式为真时,才为真,否则为假)
4.1 逻辑取反运算符
#include<stdio.h>
int main()
{
int flag = 0;
if(!flag)
{
printf("do someing");
}
return 0;
}
如果flag为真,则!flag为假,语句不执行;如果flag为假,则!flag为真,执行语句
在上面的代码中,我们可以看到flag等于0,则!flag为真,y7uju
4.2 逻辑与运算符
在逻辑与运算符中,&&是并且的意思,&&是双目运算符,使用方式为a&&b,如果两边表达式为真,整个表达式为真,有一个为假,则都为假
举例:3—5月是春天,用代码表示如下

4.3 逻辑或运算符
||是一个双目运算符,使用方式为a||b,两边的表达式至少有一个是真的,则整个表达式才是真的,如果两边都为假时,表达式是假的
举例:一年中的12、1、2月为冬季,我们如何表示

4.4 短路
C语言逻辑运算符有一个特点,它总是先对左侧的表达式求值,再对右边的表达式求值
如果左边的表达式符合逻辑运算符的条件,就不再对右边的表达式求值,这个叫短路
5. switch语句
switch是一种特殊形式的if…else结构,用于判断条件有多个结果的情况
以下为Switch的形式
switch(expression)
{
case value1:statement
case value2: statement
default: statement
}
在上面的代码中,我们根据expression不同的值,执行相应的case分支,如果我们没有在case中找到对应的值,则执行default。
注意:
- switch后的expression必须是整型表达式
- case后的值,必须是整型常量表达式
5.1 if和switch语句的对比
举例:输入一个整数,计算除以3后的余数
if语句表示
#include<stdio.h>
int main()
{
int i = 0;
scanf("%d", &i);
if (i % 3 == 0)
{
printf("余数为0\n");
}
else if (i % 3 == 1)
{
printf("余数为1\n");
}
else
{
printf("余数为2\n");
}
return 0;
}
用switch表示
#include<stdio.h>
int main()
{
int i = 0;
scanf("%d", &i);
switch (i % 3)
{
case 0:
printf("余数为0\n");
break;
case 1:
printf("余数为1\n");
break;
case 2:
printf("余数为2\n");
break;
}
return 0;
}
在上面的代码中,我们需要注意:
case和后面的数字之间需要有空格
每个case语句执行完成后,需要加上break
5.2 switch中的break
接下来,我们去掉break,会发现什么

在上图中,我们可以看见,当我们输入3时,结果为0,按理来说,应该执行语句1,但由于没有break,语句会继续执行,因此语句2也执行,而语句2后有break,语句结束,语句3不执行。
所以,我们可以知道,在Switch语句中,break是十分重要的
5.3 switch语句中的default
在使用switch时,我们可能会遇到表达式的值与代码中的case无法匹配的情况,这种情况下,我们可以不做处理,也可以加上default
举例:

5.4 case和default的顺序问题
对于switch语句,case和default的顺序没有要求,我们为了美观,通常把default放在最后
接下来,我将介绍三种循环
6. for循环
6.1 语法形式
for循环的语法形式如下
for(表达式1;表达式2;表达式3)
语句;
表达式1 用于循环变量的初始化
表达式2 用于循环结束条件的判断
表达式3 用于循环变量的调整
举例:打印1到10
#include<stdio.h>
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
printf("%d", i);
}
return 0;
}
输出结果

6.2 for循环的执行流程
接下来,我们通过图来看for循环的执行流程

首先执行表达式1初始化循环变量,接下来执行表达式2的判断部分,表达式2的结果如果==0,则循环结束;表达式2的结果如果!=0,则执行循环语句,循环语句执行完后,再去执行表达式3,调整循环变量,然后再去表达式2的地方执行判断,表达是2的结果是否为2,决定循环是否继续
整个循环的过程中,表达式1初始化部分只被执行1次,剩下的就是表达式2、循环语句、表达式3在循环
7. while循环
语法形式
#include<stdio.h>
int main()
{
初始化;
while(判断)
{
语句;
调整;
}
return 0;
}
for和while在实现循环的过程中都有初始化、判断、调整,但for循环的三个部分非常集中,便于代码的维护,而while循环的部分较为松散,所以for循环要更优一点
举例:我们依旧打印1到10
#include<stdio.h>
int main()
{
int i = 1;
while(i <= 10)
{
printf("%d ", i);
i++;
}
return 0;
}
输出结果

8. do-while循环
8.1 语法形式
do
语句;
while(表达式)
for和while循环都是先判断,条件满足就进入循环,就执行循环语句,如果不满足,就跳出循环
而do-while循环式则先直接进入循环体,然后再判断,表达式为真,则继续进行下一步,表达式为假,则跳出循环
举例:打印1到10
#include<stdio.h>
int main()
{
int i = 1;
do
{
printf("%d ", i);
i++;
} while (i <= 10);
return 0;
}
8.2 do-while循环的执行流程
我们依旧画图来展示

在do-while循环中,先执行语句,然后,判断表达式,表达式为真,则继续循环,表达式为假,则终止循环
do-while语句的循环体至少循环一次
9. break和continue语句
在执行循环的过程中,有时需要提前终止循环,因此我们有时需要break和continue
break的作用是终止所有循环,只要break语句被执行,直接跳出循环,即循环结束
continue的作用是跳过本次循环,但仍会继续下一次循环
通过举例来观察break和continue的区别

将break换成continue,我们再来观察一下

在上面两个代码中,我们可以明确看到break和continue的区别,
10. 循环的嵌套
有时我们将我们所学的循环结合在一起能更好的解决问题,这个叫嵌套循环
通过举例,我们来看一下什么是嵌套循环
举例:找出100到200的素数(只能被1和它本身整除)
1.我们先用循环解决100到200的数
2.我们用100到200的数分别除以2到这个数少1的数,判断100到200是不是素数
3.输出结果

11. goto语句
C语言提供了一种非常特别的语法,就是goto语句与跳转符号,goto语句可以实现在同一个函数内跳转到设置好的标号处
例如
#include<stdio.h>
int main()
{
printf("hehe\n");
goto next;
printf("haha\n");
next:
printf("跳过了haha的打印\n");
return 0;
}
goto如果使用不当,会导致在函数内部随意乱跳转,打乱程序的执行流程,
所以我们尽量不去使用goto,但goto语句有一个好处,就是在多层循环代码中,方便于我们快速跳出
continue的区别,
10. 循环的嵌套
有时我们将我们所学的循环结合在一起能更好的解决问题,这个叫嵌套循环
通过举例,我们来看一下什么是嵌套循环
举例:找出100到200的素数(只能被1和它本身整除)
1.我们先用循环解决100到200的数
2.我们用100到200的数分别除以2到这个数少1的数,判断100到200是不是素数
3.输出结果

11. goto语句
C语言提供了一种非常特别的语法,就是goto语句与跳转符号,goto语句可以实现在同一个函数内跳转到设置好的标号处
例如
#include<stdio.h>
int main()
{
printf("hehe\n");
goto next;
printf("haha\n");
next:
printf("跳过了haha的打印\n");
return 0;
}
goto如果使用不当,会导致在函数内部随意乱跳转,打乱程序的执行流程,
所以我们尽量不去使用goto,但goto语句有一个好处,就是在多层循环代码中,方便于我们快速跳出

3825

被折叠的 条评论
为什么被折叠?



