详解C语言之分支与循环语句
C语言是结构化的程序设计语言,有顺序结构、选择结构(分支结构)、循环结构。
1. 分支语句之if语句
1.1 if
if语句的语法形式如下:
if (表达式)
语句;
if语句的执行规则如下:如果if括号里的表达式成立(为真),则执行下面的语句;如果if括号里的表达式不成立(为假),则不执行下面的语句。
注:在C语言中非0为真,0为假。
比如:
int main()
{
int a = 1;
if (a > 0)
printf("a大于0\n");
return 0;
}
a=1显然大于0,表达式成立,执行下面的语句,打印出结果 a大于0
再比如:
int main()
{
int a = 1;
if (a)
printf("haha\n");
return 0;
}
if括号里的表达式a为1,非0,那么就会执行下面的语句,屏幕上就会打印出 haha
1.2 else
一个非0数要么大于0,要么小于0。要判断这个数是大于0还是小于0,如果我们只使用if语句,代码如下:
int main()
{
int a = 0;
scanf("%d", &a);
if (a > 0)
printf("a是正数\n");
if (a < 0)
printf("a是负数\n");
return 0;
}
这段代码可行,但需要判定两次条件。因为一个非0数如果不大于0的话,肯定是小于0,不需判定。因此,我们引入else语句
代码实现如下:
int main()
{
int a = 0;
scanf("%d", &a);
if (a > 0)
printf("a是正数\n");
else
printf("a是负数\n");
return 0;
}
这里就构成了if…else…语句
语法形式如下:
if (表达式1)
语句1;
else
语句2;
如果if括号里的表达式成立(为真),则执行语句1,且不执行else语句;如果if括号里的表达式不成立(为假),则直接跳过语句1,进入else语句中的语句2。
注意:
- if后面不要加分号,因为一个完整的分支语句还未结束,还有if下面的执行语句,else if、else语句亦是如此
- 默认情况下if和else语句中都只控制一条语句,如果if或else需要控制两条或两条以上的语句,这时用{}将需要控制的语句括起来。
比如:
int main()
{
int a = 0;
scanf("%d", &a);
if (a > 0)
{
printf("a大于0\n");
printf("a是正数\n");
}
else
{
printf("a小于0\n");
printf("a是负数\n");
}
return 0;
}
1.3 嵌套if
在实际应用情况中情况,一般不会只有一两种情况,这是只用if…else…就不够了。这时候就需要在else语句嵌套if了
基本语法形式如下:
if (表达式1)
语句1;
else if (表达式2)
语句2;
else
语句3;
比如:
输入一个数,判断是0,正数,负数
int main()
{
int a = 0;
scanf("%d", &a);
if (a > 0)
{
printf("a是正数\n");
}
else if(a < 0)//这里的if相当于嵌套在else语句中,形成嵌套结构
{
printf("a是负数\n");
}
else
{
printf("a是0\n");
}
return 0;
}
实际情况中,如果有很多种情况,就可以不断嵌套if语句
构成以下形式:
if (表达式1)
语句1;
else if (表达式2)
语句2;
else if (表达式3)
语句3;
...
else
语句;
1.4 悬空else问题
如果有多个if和else,可以记住一条规则,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;
}
很多初学者会将第一个if和else匹配,导致认为结果是haha。其实不然,这段代码是我故意调整,使else与第一个if对齐。如果你将这段代码复制到VS上时,你会发现,VS会将else与第二个if对齐
这就是因为else是最接近的那个if匹配的(也就是第二个if),因此结果应该是hehe。
为了使代码的逻辑更加的清晰,我们往往会使用大括号将分支后的语句括起来
如果想打印出haha,我们可以对代码修改成如下:
由此可见,大括号对分支语句的重要性,因此我们以后在写代码的时候要注意括号的使用,这样可以使代码的可读性更高。
2. 循环语句
2.1 while语句
语法形式:
while (表达式)
语句;
while语句的基本结构与if语句相似
两者的区别在于:1.if语句是判断表达式是否成立(为真),若为真则执行语句,若为假则跳过语句;while语句是判断表示式是否成立(为真),若为真则执行语句,执行完后再判断表示式是否成立(为真),若为真则再执行语句,不断循环,直至表达式不成立(为假)。
比如:
#include<stdio.h>
int main()
{
int a = 2;
while (a > 0)
{
printf("haha\n");
a--;
}
return 0;
}
该循环执行两次,打印了两个haha。需要注意的是当while需要控制多条语句时,需要用大括号括起来,和if语句一样。
2.2 for循环
for循环的语法结构如下:
for (表达式1; 表达式2; 表达式3)
语句;
表达式1是初始化表达式,用于循环变量的初始化,只执行一次。
表达式2是判断表达式,用于循环结束条件的判断。
表达式3是调整表达式,用与循环变量的调整。
执行流程如下:先对循环变量进行一次初始化,再判断循环条件是否满足,满足则执行语句,然后再执行表达式3,对循环变量进行调整,再判断表达式2是否满足,若满足则执行语句…依次循环,直至表达式2不成立(为假)。
比如:
在屏幕上打印0~10的值
2.3 for循环与while循环的比较
for和while都有初始化,判断,调整这三部分,但是for循环的三个部分非常集中,便于代码的维护,而如果代码较多时,while循环的三个部分就比较分散,所以从形式上for循环要更优一些,这也就是为什么三种循环结构中for循环使用的频率最高。
2.4 do…while循环
do…while循环的语法结构:
do
{
语句;
} while (表达式); //注意这里有个分号
do…while循环执行流程:直接执行一次语句,然后再判断表达式是否成立(为真),若为真,则继续循环…直至表达不成立(为假)。
do…while循环与while循环和for循环不同的是第一次循环,do…while第一次循环是直接执行语句,再判断表达式;而while、for循环是判断后再进入循环。所以,do…while至少执行一次循环。
**比如:**在屏幕上打印0~10的值
3. break与continue语句
- break的作用是终止break外的一层循环,继续往后执行
- continue的作用是跳过循环continue后面的语句,且在while循环和for循环有所不同
3.1 循环中的break
while循环中的break语句举例:![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/2f87fd2869e74b30aeb63da693d13324.png
这段代码运行只有1 2 3 4,当i = 5 时,循环就终止了。
同样地,用for循环:
3.2 循环中的continue
while循环中的continue语句举例:
while语句中的continue是跳过continue后面的语句,跳到循环判断的地方,判断表达式是否成立,若成立(为真),再次进入循环。
这段代码当i=5时,执行continue语句,判定,进入循环,后续i一直为5,因此这段代码死循环
for循环中的continue语句举例:
for循环continue跳过后面的语句,进入的是for循环的调整表达式,再进入判断表达式,若表达式成立,则继续循环。
while循环和for循环中执行continue语句后进入的表达式不同,这是两者的区别。do…while循环的break语句、continue语句几乎和while一样,这里就不举例了,可以自行测试并体会。
4. 分支语句之switch语句
switch是一种特殊形式的if…else结构,用于判断条件有多个结果的情况。它把多重的else if 改成了更易用、可读性更好的形式。
switch的语法结构:
switch (expression)
{
case value1:
statement1;
case value2:
statement2;
default:
statement;
}
根据expression得到的不同的值,执行不同的case不同分支,如果找不到对应的值,那么就执行default分支。
注:
- switch后的expression必须是整型表达式
- case后的value必须是整形常量表达式
4.1 switch语句与if语句的比较
比如:求一个除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语句,才能跳出switch语句
- 每个case分支后需要控制多条语句时,一般情况不加大括号,加了也没错
4.2 switch语句中break
上面的代码如果不加break会怎么样呢?看如下图
我们首先输入7,7除3,余1,执行case 1,即打印余数是1,执行完case1后,代码继续往下走,执行case 2,也就会打印余数是2。所以,在switch语句的每一个case分支执行完后需要加上break,跳出switch语句
注:
在if else语句中,是不能直接用break和continue的。除非是在for循环中嵌套if else语句,可以加,但那也是循环语句的break与continue,对循环结构进行break和continue
4.3 switch语句中的default
在使用switch语句中,可能会碰到switch后的表达式无法与任何一个case匹配,这时就执行default语句
**比如:**输入1-5,输出工作日;输入6-7,打印休息日
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("工作日\n");
break;
case 6:
case 7:
printf("休息日\n");
break;
default:
printf("输入错误\n");
break;
}
return 0;
}
当我们输入8时,会打印出输入错误。
end