首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【C语言】分支和循环语句

【C语言】分支和循环语句

作者头像
苏兮
发布2026-01-13 15:53:58
发布2026-01-13 15:53:58
820
举报

C语言学习

分支和循环语句 友情链接:C语言专栏

前言

提示:这里可以添加本文要记录的大概内容: C语句可分为以下五类:表达式语句、函数调用语句、控制语句、复合语句、空语句。 这篇文章便是对控制语句的详细介绍。 控制语句用于控制程序的执行流程,以实现程序的各种结构方式,它们由特定的语句定义符组成,C语 言有九种控制语句,可分成以下三类:

代码语言:javascript
复制
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

1.1 if语句

那if语句的语法结构是怎么样呢

代码语言:javascript
复制
语法结构:
if(表达式)
    语句;
    
if(表达式)
    语句1;
else
    语句2;
//多分支    
if(表达式1)
    语句1;
else if(表达式2)
    语句2;
else
    语句3;

简单点来说,就是上面的结构,接下来看个代码就很明白了:

代码语言:javascript
复制
#include<stdio.h>
int main()
{
	int age = 0;
	//输入年龄
	scanf("%d", &age);
	//判断
	if (age < 18)
	{
		printf("未成年\n");
	}
	return 0;
}

当然,咱们也可以再加一些选择

代码语言:javascript
复制
#include<stdio.h>
int main()
{
	int age = 0;
	//输入年龄
	scanf("%d", &age);
	//判断
	if (age < 18)
	{
		printf("未成年\n");
	}
	//在第一个代码的基础上加的
		else
	{
		printf("成年\n");
	}
	return 0;
}

咱们还可以再加一些选择嘛

代码语言:javascript
复制
#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为真,为真则语句执行。

1.1.1 悬空else

当中咱们写了这样的代码:

代码语言:javascript
复制
#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相匹配? 所以咱们应该要有良好的代码习惯。 那咱们这样写呢?

代码语言:javascript
复制
//适当的使用{}可以使代码的逻辑更加清楚。
#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匹配的。

1.1.2 练习(可以自己先敲一敲试试)

判断一个数是否为奇数

代码语言:javascript
复制
//判断一个数是否为奇数
#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;
}

1.2 switch语句

switch语句也是一种分支语句。 常常用于多分支的情况。

比如: 输入1,输出星期一 输入2,输出星期二 输入3,输出星期三 输入4,输出星期四 输入5,输出星期五 输入6,输出星期六 输入7,输出星期日

如果咱们写成 if…else if …else if 的形式太复杂,那我们就得有不一样的语法形式 这就是switch 语句。

代码语言:javascript
复制
switch(整型表达式)
{
    语句项;
}

语句项是什么?

代码语言:javascript
复制
//是一些case语句:
//如下:
case 整形常量表达式:
    语句;

那咱们可以试着实现一下上面举得多分支的例子:

代码语言:javascript
复制
#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;
}
1.2.1 在switch语句中的跳转语句break

在switch语句中,我们没办法直接实现分支,搭配break使用才能实现真正的分支。 那咱们再来体验一下break的作用:有时候我们不再想要上述代码的作用,而是:

  1. 输入1-5,输出的是“weekday”;
  2. 输入6-7,输出“weekend

此时,我们便可以这样写

代码语言:javascript
复制
#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语句 了

1.2.2 default子句

如果表达的值与所有的case标签的值都不匹配怎么办? 其实也没不影响什么,结果就是所有的语句都被跳过而已。 程序并不会终止,也不会报错,因为这种情况在C中并不认为是个错误。 但是,如果你并不想忽略不匹配所有标签的表达式的值时该怎么办呢? 你可以在语句列表中增加一条default子句,把下面的标签 default: 写在任何一个 case 标签可以出现的位置。 当 switch 表达式的值并不匹配所有 case 标签的值时,这个 default 子句后面的语句就会执行。 所以,每个switch语句中只能出现一条default子句。 但是它可以出现在语句列表的任何位置,而且语句流会像执行一个case标签一样执行default子句。

1.2.3 练习

可以看看这个代码最终输出什么

代码语言:javascript
复制
#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;
}

解析

解析
解析

二、循环语句

  • while
  • for
  • do while

简单图示:

#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;}

学习

考试

是否合格?

2.1 while语句

我们已经掌握了,if语句; 当条件满足的情况下,if语句后的语句执行,否则不执行。 但是这个语句只会执行一次。 由于我们发现生活中很多的实际的例子是:同一件事情我们需要完成很多次。 那我们怎么做呢? C语言中给我们引入了: while 语句,可以实现循环。

代码语言:javascript
复制
//while 语法结构
while(表达式)
 循环语句;

比如,咱们要实现在屏幕上输出1~10;有可能会这样写:

代码语言:javascript
复制
#include<stdio.h>
int main()
{	
	printf("1");
	printf("2");	
	printf("3");
	printf("4");
	//...
	return 0;
}

但实际上,这样写,是非常搓的,那咱们可以用循环来实现一下:

代码语言:javascript
复制
#include<stdio.h>
int main()
{
	int i = 0;
	while (i < 10)
	{
		printf("%d ", i + 1);
		i++;
	}
	return 0;
}

这就是while语句的基础用法。

2.1.1 while语句中的break和continue

break介绍

代码语言:javascript
复制
//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介绍

代码语言:javascript
复制
//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) ,所以陷入了死循环

所以咱们可以这样写:

代码语言:javascript
复制
//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 跳过本次循环后面的代码,直接去判断部分,进行下一次循环的判断

2.2 for循环

我们已经知道了while循环,但是我们为什么还要一个for循环呢? 首先来看看for循环的语法:

2.2.1 语法
代码语言:javascript
复制
for(表达式1; 表达式2; 表达式3)
 循环语句;

表达式1 表达式1为初始化部分,用于初始化循环变量的。 表达式2 表达式2为条件判断部分,用于判断循环时候终止。 表达式3 表达式3为调整部分,用于循环条件的调整。

  • 咱们可以使用for循环在屏幕上打印1-10的数字。
代码语言:javascript
复制
#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循环使用的频率也最高。

2.2.2 break和continue在for循环中

在for循环中也可以出现break和continue,他们的意义和在while循环中是一样的,所以怎么在这里就不多做解释了。

2.2.3 一些for循环的变种
代码语言:javascript
复制
//代码1
#include<stdio.h>
int main()
{
	for (;;)
	{
		printf("hehe\n");
	}
	//for循环中的初始化部分,判断部分,调整部分都是可以省略的,但是不建议初学时省略,很容易导致问题。
	//比如,咱们这个代码已经陷入死循环了
	//for循环的判断部分省略意味这判断会恒成立
	return 0;
}
代码语言:javascript
复制
//代码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;
}
代码语言:javascript
复制
//代码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;
}
代码语言:javascript
复制
//代码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;
}
2.2.4 一道笔试题
代码语言:javascript
复制
//请问循环要循环多少次?
#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表示逻辑假,所以循环条件一开始就不满足,循环体一次都不会执行。

2.3 do…while()循环

2.3.1 do语句的语法
代码语言:javascript
复制
do
 循环语句;
while(表达式);

从语法看,无疑是先执行,再判断

2.3.2 do语句的特点

循环至少执行一次。

代码语言:javascript
复制
#include <stdio.h>
int main()
{
	 int i = 10;
 	do
 	{
 		printf("%d\n", i);
 	}while(i<10);
 	return 0;
}

这个代码就很好的展示了do语句的特点:先执行,再判断

2.3.3 do while循环中的break和continue

在do while循环中break和continue,他们的意义和在while循环中是一样的,所以怎么在这里也就不多做解释了。

三、 goto语句

C语言中提供了可以随意滥用的 goto语句和标记跳转的标号。 从理论上 goto语句是没有必要的,实践中没有goto语句也可以很容易的写出代码。 但是某些场合下goto语句还是用得着的,最常见的用法就是终止程序在某些深度嵌套的结构的处理过 程。 例如:一次跳出两层或多层循环。 多层循环这种情况使用break是达不到目的的。它只能从最内层循环退出到上一层的循环。 goto语言真正适合的场景如下:

代码语言:javascript
复制
for(...)
    for(...)
   {
        for(...)
       {
            if(disaster)
                goto error;
       }
   }
    …
error:
 if(disaster)
         // 处理错误情况

注:循环的实现方式与goto语句相互替代会在下一篇文章实现(一个关机程序)。


总结

以上就是这次总结的内容,详细的介绍了分支和循环语句,望受用,谢谢!


附录

上文链接

《C语言核心概念全解析》

下文链接

《循环与goto语句》

专栏

C语言专栏

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-08-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • C语言学习
  • 前言
  • 一、分支语句(选择结构)
    • 1.1 if语句
      • 1.1.1 悬空else
      • 1.1.2 练习(可以自己先敲一敲试试)
    • 1.2 switch语句
      • 1.2.1 在switch语句中的跳转语句break
      • 1.2.2 default子句
      • 1.2.3 练习
  • 二、循环语句
    • 2.1 while语句
      • 2.1.1 while语句中的break和continue
    • 2.2 for循环
      • 2.2.1 语法
      • 2.2.2 break和continue在for循环中
      • 2.2.3 一些for循环的变种
      • 2.2.4 一道笔试题
    • 2.3 do…while()循环
      • 2.3.1 do语句的语法
      • 2.3.2 do语句的特点
      • 2.3.3 do while循环中的break和continue
  • 三、 goto语句
  • 总结
  • 附录
    • 上文链接
    • 下文链接
    • 专栏
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档