C语言分支循环语句

2023-11-06

需提前看:初识C语言(5)C语言一些基本常识

目录

分支语句

if语句

单if语句使用

 if else语句

if else if else语句

switch语句

switch基本结构

 break作用

default作用

循环语句

while语句

while语句结构

 while语句中break应用

 while语句中continue应用

for语句

for语句结构

for语句的省略写法

for循环中的break和continue

do while 语句

do while 语句结构

do while 语句中的break和continue


分支语句

if语句

单if语句使用

if语句是C语言中最常见的,他的结构就是if(条件),如果条件成立就进入语句,否则就不进入。使用方法如下

int main()
{
	int a = 0, b = 1;
	if (a<b)
	{   //1
        printf("1\n");
        {//2
		    printf("a<b\n");
        }
	}
	return 0;
}

需要注意的一点是,当if(条件),条件成立的时候。我们才运行最靠近if的{内容}中的内容。什么意思呢?我们运行程序,发现打印出来了,1和a<b。这就说明,注释1的括号是最靠近if的{},所以注释1的{}中的所有内容都会被打印。

还需要注意的一点就是,如果{}上面没有条件语句,{}是没有意义的

 if else语句

如果我们想写两个对立的条件,难道写两个if语句吗?毫无疑问,这样显得很呆。于是C语言提供了if else语句,if(条件){内容1}else{内容2}。这个语句的特点就是,如果条件成立,执行内容1,如果条件不成立,执行内容2。示例如下

int main()
{
	int a = 2, b = 1;
	if (a<b)
	{   
		printf("a<b\n");
	}
	else
	{
		printf("a>b\n");
	}
	return 0;
}

if else if else语句

既然有了if else语句,但是有时候我们又不可能只出现两种情况,于是C语言又提供了if else if else语句。

写法如下if(条件1){内容1}else if(条件2){内容2}else if(条件3){内容3}else{内容4},这个语句就是,进行判断条件1,如果条件1成立,执行内容1,之后的所有else if和else全部跳过。如果条件1不成立,进行条件2判断,条件2成立就执行内容2,依次类推,如果一直都不成立就执行else中的内容。

注意:如果不知道&&是什么的,可以看初识C语言(5)C语言一些基本常识

#include <stdio.h>

int main()
{
	int a = 0, b = 1;
	if (a==0 && b==0)
	{   
		printf("a=0 b=0\n");
	}
	else if (a == 0 && b == 1)
	{
		printf("a=0 b=1\n");
	}
	else if (a == 1 && b == 0)
	{
		printf("a=1 b=0\n");
	}
	else
	{
		printf("a=1 b=1\n");
	}
	return 0;
}

switch语句

switch基本结构

有时候可能会出现多分支的情况,比如说,输入1,执行内容1。输入2,执行内容2。如果我们全部用if else if会显得很不美观。于是C语言提供了switch语句,用法如下

#include <stdio.h>

int main()
{
	int a = 2;
	switch (a)
	{
		case 1:printf("星期1\n"); break;
		case 2:printf("星期2\n"); break;
		case 3:printf("星期3\n"); break;
		case 4:printf("星期4\n"); break;
		case 5:printf("星期5\n"); break;
		default:printf("周末\n"); break;
	}
	return 0;
}

 这个意思就是说,如果变量a是1-5,就输出周一至周五,如果变量不是1-5,就输出周末。结果如下

很多人可能还没有理解switch语句是什么。以这个为例子,a是2,程序就直接跳到case 2:然后依次执行后面的所有内容!这个时候有人会有疑惑,明明这里只输出了一个星期2啊,怎么是从case2开始依次执行后面的所有内容呢?原因很简单,因为我们这里加了break;

 break作用

我们看到,switch语句,每一个case后面都有一个break;我们尝试去掉break看看会发生什么

#include <stdio.h>

int main()
{
	int a = 2;
	switch (a)
	{
		case 1:printf("星期1\n"); 
		case 2:printf("星期2\n"); 
		case 3:printf("星期3\n");
		case 4:printf("星期4\n"); 
		case 5:printf("星期5\n"); 
		default:printf("周末\n"); 
	}
	return 0;
}

结果如下

 很明显,我们发现他输出了星期2—星期5和周末。这就是我们上面说的程序就直接跳到case 2:然后依次执行后面的所有内容!

现在我们知道了break的作用就是结束switch这个语句。

default作用

我们看到switch最后面有一个default,而这个default作用和if else中的else的作用一样。就是说,如果输入的变量a都不满足上面case的要求,他就执行default这个语句。看代码

#include <stdio.h>

int main()
{
	int a = 6;
	switch (a)
	{
		case 1:printf("星期1\n"); break;
		case 2:printf("星期2\n"); break;
		case 3:printf("星期3\n"); break;
		case 4:printf("星期4\n"); break;
		case 5:printf("星期5\n"); break;
		//default:printf("周末\n"); break;
	}
	return 0;
}

结果我们看到什么都没有输出

循环语句

while语句

while语句结构

while语句比较简单,while(条件){内容},只要条件成立,内容就一直执行。所以我们需要一个让条件在内容中受到衰减,最后条件不满足。否则程序会一直进行下去(注意,在嵌入式写程序中,一定会有一个while(1)让程序一直跑下去,因为我们不能让程序停止

这个地方a--。表示a这个变量在自己减1,比如说a现在是6,a--之后,a现在就是5了。

#include <stdio.h>

int main()
{
	int a = 6;
	while (a)
	{
		printf("a=%d\n", a);
		a--;  //条件在内容中衰减,逐渐接近不满足条件
	}
	return 0;
}

 输出结果

 while语句中break应用

我们根据上面所学,可以知道break可以结束一个switch语句。但是break在C语言中作用不仅如此,他还可以结束当前的循环。

在循环中只要遇到break,就停止后期的所有的循环,直接终止循环。所以:while中的break是用于永久终止循环的。

#include <stdio.h>


int main()
{
	int i = 1;
	while (i <= 10)
	{
		if (i == 5)
			break;        //注意,当if后面没有加{}的时候,认为接下来的一个语句是if的内容,第二个语句不在if内容中。也就是说printf不是if语句的内容
		printf("%d ", i);
		i = i + 1;
	}
	return 0;
}

根据上面代码,我们运行结果如下

 可以看到,程序就输出了1,2,3,4。但是没有输出5和接下来的数字。这就是因为break在作用。当i=5的时候,进入if语句,然后break结束当前while循环。需要注意,break只会匹配最近while或者switch。

#include <stdio.h>


int main()
{
	int i = 1, a = 2;
	while (a)
	{
		i = 1;
		a--;
		printf("a=%d\n ",a);
		while (i <= 10)
		{
			if (i >= 5)
				break;
			printf("i=%d ", i);
			i = i + 1;
		}
	}
	return 0;
}

我们执行上面代码,结果是而假如我们把这个break放在外面看看会怎么样

#include <stdio.h>


int main()
{
	int i = 1, a = 2;
	while (a)
	{
		i = 1;
		a--;
		printf("a=%d\n ",a);
		while (i <= 10)
		{
			printf("i=%d ", i);
			i = i + 1;
		}
		if (i >= 5)
			break;
	}
	return 0;
}

  结果发现只有一个a=1,这就表明了,break只能结束一次循环,而这次循环就是最接近他的那个。

 至于switch可以自己尝试使用以下,我再次就不再啰嗦了

int main()
{
	int i = 1;
	while (i <= 10)
	{
		switch (i)
		{
			case 1:printf("i=1 "); break;
			case 2:printf("i=2 "); break;
			case 3:printf("i=3 "); break;
			case 4:printf("i=4 "); break;
			case 5:printf("i=5 "); break;
			case 6:printf("i=6 "); break;
			case 7:printf("i=7 "); break;
			case 8:printf("i=8 "); break;
			case 9:printf("i=9 "); break;
			case 10:printf("i=10 "); break;
		}
		
		i = i + 1;
	}
	return 0;
}

 while语句中continue应用

continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行,而是直接跳转到while语句的判断部分。进行下一次循环的入口判断。

#include <stdio.h>

int main()
{
	int i = 1;
	while (i <= 10)
	{
		i = i + 1;
		if (i == 5)
			continue;
		printf("%d ", i);
	}
	return 0;
}

 打印出来结果,我们发现只有5没有被打印。这就解释了结束continue后面的语句,重新开始进行进行while判断。

 这个时候有人会有疑惑,我的i一开始明明是1啊,为什么是从2开始打印的呢?我们可以看到,在while循环里面,我们先是i自增了一次,然后再打印的,所以是从2开始打印。

但是有人就说,如果我把i=i+1放在while语句的最后面不可以了吗?我们尝试一下

#include <stdio.h>

int main()
{
	int i = 1;
	while (i <= 10)
	{
		if (i == 5)
			continue;
		printf("%d ", i);
		i = i + 1;
	}
	return 0;
}

 结果如下,程序打印出4之后,就不动了。也不弹出 请按任意键继续. . .的提示,这是为什么呢?因为程序还在运行,所以没有弹出。

我们说了,结束continue后面的语句,重新开始进行进行while判断。但是因为i=i+1放在了continue后面,那么i=5成立的时候,i永远不会自增,这就导致i永远会是5,while语句的i<=10永远成立,从而进入一个死循环。

 

for语句

for语句结构

现在我们开始说for语句,这个语句比较重要,经常会用到!!!for语句的结构如下。

for(表达式1; 表达式2; 表达式3)
 循环语句;

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

 其实for语句的作用和while语句类似,都是用于循环的。但是for语句有一个特点,他可以进行条件的调整和初始化,这样让程序更加具有阅读性。我们拿上面那个while做例子

//while示例

int i = 1;
while (i <= 10)
{
    i++;   //自增,和i = i + 1;一个意思
}

//for示例
int i;
for(i=1;i<=10;i++)
{

}

根据两者对比,很明显看到for语句更加方便,特别是循环条件的调整,直接写在了for里面,方便查看。

for语句的省略写法

我们可以看到,一般定义变量的时候就已经初始化了,如果我们在for语句中的初始化部分和定义变量的初始化一样,是不是可以省略掉初始化部分?答案是可以的,其实for循环中,唯一不可省略的部分就是中间的判断部分

//while示例

int i = 1;
while (i <= 10)
{
    i++;   //自增,和i = i + 1;一个意思
}

//for示例
int i=1;
for(;i<=10;)  //注意,第一个“;”必须写上!!!第三个";"可以省略
{
    i++;
}

for循环中的break和continue

我们发现在for循环中也可以出现break和continue,他们的意义和在while循环中是一样的。 但是还是有些差异。

在break中,for和while区别不大。两个代码结果一样

#include <stdio.h>
int main()
{
	int i = 0;
	for (i = 1; i <= 10; i++)
	{
		if (i == 5)
			break;
		printf("%d ", i);
	}
	return 0;
}

#include <stdio.h>
int main()
{
	int i = 1;
	while (i <= 10)
	{
		if (i == 5)
			break;
		printf("%d ", i);
		i = i + 1;
	}
	return 0;
}

 但是continue不一样,还是有些许的区别。我们对比两个代码发现,for循环中,可以成功打印除5以外的1-10所有数字。而while循环中,打印的是除5以外的2-11所有数字。

这个是为什么呢?因为while中是先进行i自增,再打印,所以是2-11的数字,并且i自增不能写在continue之后,不然会进入死循环。(上面讲了)但是for不一样,这个i的自增是执行完for里面的内容之后再进行的。这个i自增不属于for里面的内容,不会被continue给省略掉。

#include <stdio.h>

int main()
{
	int i = 0;
	for (i = 1; i <= 10; i++)
	{
		if (i == 5)
			continue;
		printf("%d ", i);
	}
	return 0;
}

#include <stdio.h>

int main()
{
	int i = 1;
	while (i <= 10)
	{
		i = i + 1;
		if (i == 5)
			continue;
		printf("%d ", i);
	}
	return 0;
}

do while 语句

do while 语句结构

do while比较特殊,他是先执行内容再进行条件判断。这就表明了至少要循环一次,很少用,而且它的作用while都可以实现,了解一下即可。以下是他的结构:

do
 循环语句;
while(表达式);

这个语句也没什么可讲的,while语句就是先条件判断,再执行语句。do while就是先执行语句,再条件判断,条件判断成功重新执行一次语句,如果条件判断失败,跳出循环。这导致他至少执行一次命令。

通俗的话来说就是,while是一个听话的孩子,父母说可以做,他才做。而do while不一样,他喜欢先斩后奏,先打游戏,如果父母看见允许就继续打游戏,如果不同意,那起码打了一盘游戏再结束呗,不亏。

需要注意:当第一次进入do while语句之后,执行完语句,然后就可以相当于是在执行while语句了。还是讲个例子理解一下。

#include <stdio.h>
int main()
{
 int i = 10;
 do
 {
 printf("%d\n", i);
 }while(i<10);
 return 0;
}

看这个代码,如果是while语句,那么他就不会执行。但是是do while,那么先执行一次语句,再和while语句一样,条件不成立,不执行语句。

do while 语句中的break和continue

do while中的break和continue与while一样。一样需要注意,i++要再continue前面。(只有for语句不需要注意这一点!

//break示例
#include <stdio.h>
int main()
{
	int i = 1;

	do
	{
		if (5 == i)
			break;
		printf("%d\n", i);
		i++;
	} while (i<10);

	return 0;
}

//continue示例
#include <stdio.h>
int main()
{
	int i = 1;

	do
	{
		i++;
		if (5 == i)
			continue;
		printf("%d\n", i);
	} while (i<10);

	return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言分支循环语句 的相关文章

  • Windows 10 Mobile (10.0.14393) 地理围栏后台任务 (LocationTrigger)

    自从10 0 14393 周年纪念更新 LocationTrigger似乎不起作用 我有 Windows Phone 8 1 应用程序 也适用于 UWP 应用程序 输出到的便携式库Windows Runtime Component图书馆 w
  • clang 格式换行符在错误的位置

    给出以下代码行 get abc manager get platform status abc platform status sw update status fill update status actions allowed stat
  • 为什么大多数平台上没有“aligned_realloc”?

    MSVC有自己的非标准函数 aligned malloc aligned realloc and aligned free C 17和C11引入了 std aligned alloc 其结果可以是de分配有free or realloc B
  • HttpWebRequest vs Webclient(特殊场景)

    我知道这个问题之前已经回答过thread https stackoverflow com questions 1694388 webclient vs httpwebrequest httpwebresponse 但我似乎找不到详细信息 在
  • 将带有 glut 的点击坐标添加到向量链接列表中

    我想创建一个向量链接列表 并在 GLUT 库的帮助下获取点击的位置并将它们附加到链接列表中 这些是我写的结构 typedef struct vector int x int y Vector typedef struct VectorLis
  • 从 Code::Blocks 运行程序时出现空白控制台窗口 [重复]

    这个问题在这里已经有答案了 当我尝试在 Code Blocks 中构建并运行新程序时 控制台窗口弹出空白 我必须单击退出按钮才能停止它 它对我尝试过的任何新项目 包括 Hello world 都执行此操作 奇怪的是 它对于我拥有的任何旧项目
  • 从成员函数指针类型生成函子

    我正在尝试简化 通过make fn 预处理参数的函子的生成 通过wrap 对于 arity 的成员函数n 生成函子基本上可以工作 但到目前为止只能通过显式指定成员函数的参数类型来实现 现在我想从它处理的成员函数类型生成正确的函子 struc
  • libxml2 xmlChar * 到 std::wstring

    libxml2似乎将所有字符串存储在 UTF 8 中 如xmlChar xmlChar This is a basic byte in an UTF 8 encoded string It s unsigned allowing to pi
  • C++ 插件的“最适合”动态类型匹配

    我有一个几乎所有东西都是插件的架构 该架构以图形用户界面为基础 其中每个插件都由一个 表面 即用户可以通过其与插件交互的 UI 控件 表示 这些表面也是插件 每当添加新插件时 瘦主机都会自动确定哪个可用表面与其最匹配的 UI 如何在 C 中
  • 默认析构函数做了多少事情

    C 类中的默认析构函数是否会自动删除代码中未显式分配的成员 例如 class C public C int arr 100 int main void C myC new C delete myC return 0 删除 myC 会自动释放
  • 分配器感知容器和propagate_on_container_swap

    The std allocator traits模板定义了一些常量 例如propagate on container copy move assign让其他容器知道它们是否应该在复制或移动操作期间复制第二个容器的分配器 我们还有propag
  • tabcontrol selectedindex 更改事件未被触发 C#

    嘿伙计们 我有一个很小的问题 请参阅下面的代码 this is main load private void Form1 Load object sender EventArgs e tabAddRemoveOperator Selecte
  • 二叉树中的 BFS

    我正在尝试编写二叉树中广度优先搜索的代码 我已将所有数据存储在队列中 但我不知道如何访问所有节点并消耗它们的所有子节点 这是我的 C 代码 void breadthFirstSearch btree bt queue q if bt NUL
  • 从 R 到 C 处理列表并访问它

    我想使用从 R 获得的 C 列表 我意识到这个问题与此非常相似 使用 call 在 R 和 C 之间传递数据帧 https stackoverflow com questions 6658168 passing a data frame f
  • asp.net网格分页的SQL查询

    我在用iBatis and SQLServer 使用偏移量和限制进行分页查询的最佳方法是什么 也许我添加该列ROW NUMBER OVER ORDER BY Id AS RowNum 但这只会阻止简单查询的数据访问 在某些情况下 我使用选择
  • 为什么要在 C++ 中使用 typedef?

    可以说我有 set
  • 使用 iTextSharp 5.3.3 和 USB 令牌签署 PDF

    我是 iTextSharp 和 StackOverFlow 的新手 我正在尝试使用外部 USB 令牌在 C 中签署 PDF 我尝试使用从互联网上挖掘的以下代码 Org BouncyCastle X509 X509CertificatePar
  • 使用 HTMLAgilityPack 从节点的子节点中选择所有

    我有以下代码用于获取 html 页面 将网址设置为绝对 然后将链接设置为 rel nofollow 并在新窗口 选项卡中打开 我的问题是关于将属性添加到 a s string url http www mysite com string s
  • C语言声明数组没有初始大小

    编写一个程序来操纵温度详细信息 如下所示 输入要计算的天数 主功能 输入摄氏度温度 输入功能 将温度从摄氏度转换为华氏度 独立功能 查找华氏度的平均温度 我怎样才能在没有数组初始大小的情况下制作这个程序 include
  • 受限 AppDomain 中的代码访问安全异常

    Goal 我需要在权限非常有限的 AppDomain 中运行一些代码 它不应该访问任何花哨或不安全的内容 except对于我在其他地方定义的一些辅助方法 我做了什么 我正在创建一个具有所需基本权限的沙箱 AppDomain 并创建一个运行代

随机推荐

  • GFS论文解读

    文章目录 1 设计概述 1 1 假设 1 2 GFS架构 1 3 读取流程 1 4 元数据 1 5 操作日志 1 6 一致性模型 2 系统交互 2 1 契约机制 2 2 数据写入过程 2 3 数据流 2 4 原子的记录追加 1 设计概述 1
  • Leetcode[链表] 反转链表 -- 双指针法

    0 题目描述 leetcode原题链接 反转链表 1 双指针法 定义两个指针 pre 和 cur pre 在前 cur 在后 每次让 pre 的 next 指向 cur 实现一次局部反转 局部反转完成之后 pre 和 cur 同时往前移动一
  • Kotlin 31. Kotlin 如何删除文件或文件夹

    Kotlin 如何删除文件或文件夹 比如 我们想要删除 Documents 年月日 文件夹下面的所有文件 包括这个文件夹 我们首先需要获得 Documents 的路径 val extDir File Environment getExter
  • ESP32——WIFI

    WiFi Wi Fi 库支持配置及监控 ESP32 Wi Fi 连网功能 WiFi工作模式 基站模式 即 STA 模式或 Wi Fi 客户端模式 此时 ESP32 连接到接入点 AP AP 模式 即 Soft AP 模式或接入点模式 此时基
  • 第二章 构造函数语意学 编译器何时合成拷贝构造函数?

    首先要清楚位拷贝 浅拷贝 和值拷贝 深拷贝 的区别 参考http blog sina com cn s blog a2aa00d70101gpvj html 位拷贝 及 bitwise copy 是指将一个对象的内存映像按位原封不动的复制给
  • STM32开发实例 基于STM32单片机的氛围灯

    一 系统设计 我想做的是个基于WIFI 的智能氛围灯 这个灯用app控制 首先这个灯在APP上面可以选择颜色 注 RGB 和亮度调节 音乐律动模式可跟随手机上播放的音乐改变亮度 光照模式白天关灯晚上开灯 人体感应模式有人时开灯反之关灯 智能
  • CSDN竞赛第45期题解

    CSDN竞赛第45期题解 1 题目名称 勾股数 勾股数是一组三个正整数 它们可以作为直角三角形的三条边 比如3 4 5就是一组勾股数 如果给出一组勾股数其中的 两个 你能找出余下的一个吗 ll a b cin gt gt a gt gt b
  • 图神经网络 PyTorch Geometric 入门教程

    简介 Graph Neural Networks 简称 GNN 称为图神经网络 是深度学习中近年来一个比较受关注的领域 近年来 GNN 在学术界受到的关注越来越多 与之相关的论文数量呈上升趋势 GNN 通过对信息的传递 转换和聚合实现特征的
  • php性能优化

    前言 在经历2 3年的时间 php程序员可以完成基本的功能性开发 但是这时候会有一个小瓶颈 就是不知道怎么去优化自己的代码 优化代码主要有两方面 1 php代码规范的优化 让自己代码变的更具可维护性 可读性更强 便于团队开发协作 这里就不作
  • 从char到QChar

    char类型是c c 中内置的类型 描述了1个字节的内存信息的解析 比如 char gemfield g 那么在由gemfield标记的这块内存的大小就是1个字节 信息就是01100111 8位 再比如 char gemfield 汉 那么
  • Java设计模式之观察者模式

    摘录 观察者模式是对象的行为模式 又叫发布 订阅 Publish Subscribe 模式 模型 视图 Model View 模式 源 监听器 Source Listener 模式或从属者 Dependents 模式 观察者模式定义了一种一
  • linux rfkill

    http blog csdn net eager7 article details 8121143
  • FFmpeg音视频播放器流程

    音视频播放器流程 ffmpeg解封装解码流程API ffmpeg官网 FFmpeg
  • [STM32]KEIL调试程序进入HardFault_Handler异常处理总结

    在做CORTEX M3单片机开发的时候 如STM32 可能会遇到设备跑着跑着程序死机的情况 往往调试起来很多时候发现是程序进入HardFault Handler系统异常 根据相关资料和M3权威指南是可以通过调试查找出程序的问题点和解决问题的
  • eclipse gradle打包_Spring Boot(十二):Spring Boot 如何测试打包部署

    部分面试资料链接 https pan baidu com s 1qDb2YoCopCHoQXH15jiLhA 密码 jsam 想获得全部面试必看资料 关注公众号 大家可以在公众号后台回复 知乎 即可 有很多网友会时不时的问我 Spring
  • 一个人的成功不是没有理由的!(人物之楼天城)

    昨天 杭州第十四中学请来毕业生楼天城 给全体学生做励志讲座 讲高中三年的学习生活和理科思维的培养 讲座前 老师介绍 楼天城同学2004年毕业于十四中 保送清华大学 博士毕业 是公认的计算机天才 公认的中国大学生编程竞赛第一人 常以一人单挑一
  • 利用python摘取文本中所需信息,并保存为txt格式

    项目所需 IC设计中难免会处理大量文本信息 我就在项目中遇到了 对于一个几万行的解码模块 提取出其中的指令 如果不用脚本将会很麻烦 下面我将一个小小的例子分享给大家 刚学python 如果有更方便的实现方法清多多指教 目的 1 在几万行解码
  • Git常用命令总结

    Git常用命令总结 git init 在本地新建一个repo 进入一个项目目录 执行git init 会初始化一个repo 并在当前文件夹下创建一个 git文件夹 git clone 获取一个url对应的远程Git repo 创建一个loc
  • openssl的证书链验证

    原文地址 http blog csdn net dog250 article details 5442914 使用openssl验证证书链可以用以下命令 debian home zhaoya openssl openssl verify C
  • C语言分支循环语句

    需提前看 初识C语言 5 C语言一些基本常识 目录 分支语句 if语句 单if语句使用 if else语句 if else if else语句 switch语句 switch基本结构 break作用 default作用 循环语句 while