分支和循环语句 友情链接:C语言专栏
提示:这里可以添加本文要记录的大概内容:
C语句可分为以下五类:表达式语句、函数调用语句、控制语句、复合语句、空语句。
这篇文章便是对控制语句的详细介绍。
控制语句用于控制程序的执行流程,以实现程序的各种结构方式,它们由特定的语句定义符组成,C语
言有九种控制语句,可分成以下三类:
1. 条件判断语句也叫分支语句:if语句、switch语句;
2. 循环执行语句:do while语句、while语句、for语句;
3. 转向语句:break语句、goto语句、continue语句、return语句简单图示
#mermaid-svg-BiBGc30jKBBjgo10 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-BiBGc30jKBBjgo10 .error-icon{fill:#552222;}#mermaid-svg-BiBGc30jKBBjgo10 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-BiBGc30jKBBjgo10 .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-BiBGc30jKBBjgo10 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-BiBGc30jKBBjgo10 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-BiBGc30jKBBjgo10 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-BiBGc30jKBBjgo10 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-BiBGc30jKBBjgo10 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-BiBGc30jKBBjgo10 .marker.cross{stroke:#333333;}#mermaid-svg-BiBGc30jKBBjgo10 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-BiBGc30jKBBjgo10 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-BiBGc30jKBBjgo10 .cluster-label text{fill:#333;}#mermaid-svg-BiBGc30jKBBjgo10 .cluster-label span{color:#333;}#mermaid-svg-BiBGc30jKBBjgo10 .label text,#mermaid-svg-BiBGc30jKBBjgo10 span{fill:#333;color:#333;}#mermaid-svg-BiBGc30jKBBjgo10 .node rect,#mermaid-svg-BiBGc30jKBBjgo10 .node circle,#mermaid-svg-BiBGc30jKBBjgo10 .node ellipse,#mermaid-svg-BiBGc30jKBBjgo10 .node polygon,#mermaid-svg-BiBGc30jKBBjgo10 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-BiBGc30jKBBjgo10 .node .label{text-align:center;}#mermaid-svg-BiBGc30jKBBjgo10 .node.clickable{cursor:pointer;}#mermaid-svg-BiBGc30jKBBjgo10 .arrowheadPath{fill:#333333;}#mermaid-svg-BiBGc30jKBBjgo10 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-BiBGc30jKBBjgo10 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-BiBGc30jKBBjgo10 .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-BiBGc30jKBBjgo10 .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-BiBGc30jKBBjgo10 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-BiBGc30jKBBjgo10 .cluster text{fill:#333;}#mermaid-svg-BiBGc30jKBBjgo10 .cluster span{color:#333;}#mermaid-svg-BiBGc30jKBBjgo10 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-BiBGc30jKBBjgo10 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}
学习
认真
不认真
好offer
没offer
那if语句的语法结构是怎么样呢
语法结构:
if(表达式)
语句;
if(表达式)
语句1;
else
语句2;
//多分支
if(表达式1)
语句1;
else if(表达式2)
语句2;
else
语句3;简单点来说,就是上面的结构,接下来看个代码就很明白了:
#include<stdio.h>
int main()
{
int age = 0;
//输入年龄
scanf("%d", &age);
//判断
if (age < 18)
{
printf("未成年\n");
}
return 0;
}当然,咱们也可以再加一些选择
#include<stdio.h>
int main()
{
int age = 0;
//输入年龄
scanf("%d", &age);
//判断
if (age < 18)
{
printf("未成年\n");
}
//在第一个代码的基础上加的
else
{
printf("成年\n");
}
return 0;
}咱们还可以再加一些选择嘛
#include<stdio.h>
int main()
{
int age = 0;
//输入年龄
scanf("%d", &age);
//判断
if (age < 18)
{
printf("未成年\n");
}
else if (age > 18 && age < 60)
{
printf("成年\n");
}
else
{
printf("老年\n");
}
return 0;
}解释:
{ }为单条语句时,可以省略; 在C语言中,0为假,非0为真,为真则语句执行。
当中咱们写了这样的代码:
#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;
}此时,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;
}但是咱们也要记得:else是和它离的最近的if匹配的。
判断一个数是否为奇数
//判断一个数是否为奇数
#include<stdio.h>
int main()
{
int n = 0;
//输入
scanf("%d", &n);
//判断
if (n % 2 != 0)
{
printf("%d是奇数\n", n);
}
else
printf("%d不是奇数\n", n);
return 0;
}switch语句也是一种分支语句。 常常用于多分支的情况。
比如: 输入1,输出星期一 输入2,输出星期二 输入3,输出星期三 输入4,输出星期四 输入5,输出星期五 输入6,输出星期六 输入7,输出星期日
如果咱们写成 if…else if …else if 的形式太复杂,那我们就得有不一样的语法形式 这就是switch 语句。
switch(整型表达式)
{
语句项;
}那语句项是什么?
//是一些case语句:
//如下:
case 整形常量表达式:
语句;那咱们可以试着实现一下上面举得多分支的例子:
#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;
}在switch语句中,我们没办法直接实现分支,搭配break使用才能实现真正的分支。 那咱们再来体验一下break的作用:有时候我们不再想要上述代码的作用,而是:
此时,我们便可以这样写
#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;
}想必大家对break语句的作用已经很了解了,也可以说: break语句的实际效果是把语句列表划分为不同的分支部分。 总结:
switch后面表达式的值决定它进入哪个case语句,但是至于从哪里出来,就要看break语句 了
如果表达的值与所有的case标签的值都不匹配怎么办?
其实也没不影响什么,结果就是所有的语句都被跳过而已。
程序并不会终止,也不会报错,因为这种情况在C中并不认为是个错误。
但是,如果你并不想忽略不匹配所有标签的表达式的值时该怎么办呢?
你可以在语句列表中增加一条default子句,把下面的标签
default:
写在任何一个 case 标签可以出现的位置。
当 switch 表达式的值并不匹配所有 case 标签的值时,这个 default 子句后面的语句就会执行。
所以,每个switch语句中只能出现一条default子句。
但是它可以出现在语句列表的任何位置,而且语句流会像执行一个case标签一样执行default子句。
可以看看这个代码最终输出什么
#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;
}解析

简单图示:
#mermaid-svg-5v8mTRrkqubyWikp {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-5v8mTRrkqubyWikp .error-icon{fill:#552222;}#mermaid-svg-5v8mTRrkqubyWikp .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-5v8mTRrkqubyWikp .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-5v8mTRrkqubyWikp .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-5v8mTRrkqubyWikp .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-5v8mTRrkqubyWikp .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-5v8mTRrkqubyWikp .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-5v8mTRrkqubyWikp .marker{fill:#333333;stroke:#333333;}#mermaid-svg-5v8mTRrkqubyWikp .marker.cross{stroke:#333333;}#mermaid-svg-5v8mTRrkqubyWikp svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-5v8mTRrkqubyWikp .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-5v8mTRrkqubyWikp .cluster-label text{fill:#333;}#mermaid-svg-5v8mTRrkqubyWikp .cluster-label span{color:#333;}#mermaid-svg-5v8mTRrkqubyWikp .label text,#mermaid-svg-5v8mTRrkqubyWikp span{fill:#333;color:#333;}#mermaid-svg-5v8mTRrkqubyWikp .node rect,#mermaid-svg-5v8mTRrkqubyWikp .node circle,#mermaid-svg-5v8mTRrkqubyWikp .node ellipse,#mermaid-svg-5v8mTRrkqubyWikp .node polygon,#mermaid-svg-5v8mTRrkqubyWikp .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-5v8mTRrkqubyWikp .node .label{text-align:center;}#mermaid-svg-5v8mTRrkqubyWikp .node.clickable{cursor:pointer;}#mermaid-svg-5v8mTRrkqubyWikp .arrowheadPath{fill:#333333;}#mermaid-svg-5v8mTRrkqubyWikp .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-5v8mTRrkqubyWikp .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-5v8mTRrkqubyWikp .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-5v8mTRrkqubyWikp .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-5v8mTRrkqubyWikp .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-5v8mTRrkqubyWikp .cluster text{fill:#333;}#mermaid-svg-5v8mTRrkqubyWikp .cluster span{color:#333;}#mermaid-svg-5v8mTRrkqubyWikp div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-5v8mTRrkqubyWikp :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}
是
否
学习
考试
是否合格?
过
我们已经掌握了,if语句; 当条件满足的情况下,if语句后的语句执行,否则不执行。 但是这个语句只会执行一次。 由于我们发现生活中很多的实际的例子是:同一件事情我们需要完成很多次。 那我们怎么做呢? C语言中给我们引入了: while 语句,可以实现循环。
//while 语法结构
while(表达式)
循环语句;比如,咱们要实现在屏幕上输出1~10;有可能会这样写:
#include<stdio.h>
int main()
{
printf("1");
printf("2");
printf("3");
printf("4");
//...
return 0;
}但实际上,这样写,是非常搓的,那咱们可以用循环来实现一下:
#include<stdio.h>
int main()
{
int i = 0;
while (i < 10)
{
printf("%d ", i + 1);
i++;
}
return 0;
}这就是while语句的基础用法。
break介绍
//break 代码实例
#include <stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)
break;
printf("%d ", i);
i = i + 1;
}
return 0;
}这段代码输出的结果是什么?

分析:
在 i<5 之前,一直执行循环,而当 i==5 时,满足 if 语句,执行break,跳出循环
总结:
break在while循环中的作用: 其实在循环中只要遇到break,就停止后期的所有的循环,直接终止循环。 所以:while中的break是用于永久终止循环的。
continue介绍
//continue 代码实例1
//将上面的代码的break改为continue
#include <stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)
continue;
printf("%d ", i);
i = i + 1;
}
return 0;
}然而,将此代码运行起来,我们会发现,陷入了死循环

那为什么会造成这种现象呢?
这是因为,continue是将本次循环终止(对应上面的代码就是 i==5 时),也就是本次循环中continue后边的代码不会再执行。 而是直接跳转到while语句的判断部分。进行下一次循环的入口判断。 而判断之后遇到的语句又是 if (i == 5) ,所以陷入了死循环
所以咱们可以这样写:
//continue 代码实例
#include <stdio.h>
int main()
{
int i = 0;
while (i < 10)
{
i = i + 1;
if (i == 5)
continue;
printf("%d ", i);
}
return 0;
}
可见,while循环中的:
break是用于永久的终止循环 continue 跳过本次循环后面的代码,直接去判断部分,进行下一次循环的判断
我们已经知道了while循环,但是我们为什么还要一个for循环呢? 首先来看看for循环的语法:
for(表达式1; 表达式2; 表达式3)
循环语句;表达式1 表达式1为初始化部分,用于初始化循环变量的。 表达式2 表达式2为条件判断部分,用于判断循环时候终止。 表达式3 表达式3为调整部分,用于循环条件的调整。
#include <stdio.h>
int main()
{
int i = 0;
//for(i=1/*初始化*/; i<=10/*判断部分*/; i++/*调整部分*/)
for(i=1; i<=10; i++)
{
printf("%d ", i);
}
return 0;
}相比之下,可以发现在for循环中循环的三个必须条件较为集中,而在while循环中,由于代码风格的不同,使得在while循环中循环的三个必须条件很可能偏离较远所以,for循环的风格更胜一筹;for循环使用的频率也最高。
在for循环中也可以出现break和continue,他们的意义和在while循环中是一样的,所以怎么在这里就不多做解释了。
//代码1
#include<stdio.h>
int main()
{
for (;;)
{
printf("hehe\n");
}
//for循环中的初始化部分,判断部分,调整部分都是可以省略的,但是不建议初学时省略,很容易导致问题。
//比如,咱们这个代码已经陷入死循环了
//for循环的判断部分省略意味这判断会恒成立
return 0;
}//代码2
#include<stdio.h>
int main()
{
int i = 0;
int j = 0;
//这里打印多少个hehe?
for (i = 0; i < 10; i++)
{
for (j = 0; j < 10; j++)
{
printf("hehe\n");
}
}
//显然,这是一个for循环的嵌套;
//即为100个hehe
return 0;
}//代码3
#include<stdio.h>
int main()
{
int i = 0;
int j = 0;
//如果省略掉初始化部分,这里打印多少个hehe?
for(; i<10; i++)
{
for(; j<10; j++)
{
printf("hehe\n");
}
}
//当省略掉初始化部分,i=0时进入嵌套的循环里面,打印10次hehe,之后,j一直是10;
//之后,不论i为多少,j一直为10,就不会打印了
return 0;
}//代码4
#include<stdio.h>
int main()
{
//使用多余一个变量控制循环
int x, y;
for (x = 0, y = 0; x < 2 && y < 5; ++x, y++)
{
printf("hehe\n");
}
//这个就是同时满足两个条件即可
return 0;
}//请问循环要循环多少次?
#include <stdio.h>
int main()
{
int i = 0;
int k = 0;
for (i = 0, k = 0; k = 0; i++, k++)
k++;
return 0;
}解释:
for循环的条件判断部分是k = 0 ,这里的=是赋值运算符,不是比较运算符==。k = 0这个表达式会将0赋值给k,并且该赋值表达式的值就是赋值后的值,即0。在 C 语言中,0表示逻辑假,所以循环条件一开始就不满足,循环体一次都不会执行。
do
循环语句;
while(表达式);从语法看,无疑是先执行,再判断
循环至少执行一次。
#include <stdio.h>
int main()
{
int i = 10;
do
{
printf("%d\n", i);
}while(i<10);
return 0;
}这个代码就很好的展示了do语句的特点:先执行,再判断。
在do while循环中break和continue,他们的意义和在while循环中是一样的,所以怎么在这里也就不多做解释了。
C语言中提供了可以随意滥用的 goto语句和标记跳转的标号。 从理论上 goto语句是没有必要的,实践中没有goto语句也可以很容易的写出代码。 但是某些场合下goto语句还是用得着的,最常见的用法就是终止程序在某些深度嵌套的结构的处理过 程。 例如:一次跳出两层或多层循环。 多层循环这种情况使用break是达不到目的的。它只能从最内层循环退出到上一层的循环。 goto语言真正适合的场景如下:
for(...)
for(...)
{
for(...)
{
if(disaster)
goto error;
}
}
…
error:
if(disaster)
// 处理错误情况注:循环的实现方式与goto语句相互替代会在下一篇文章实现(一个关机程序)。
以上就是这次总结的内容,详细的介绍了分支和循环语句,望受用,谢谢!