C语言分支循环语句详解

分支和循环语句是什么

在我们写程序的时候,总会遇到想一直循环执行某种语句的时候,这时候我们就要使用一种语句叫循环语句,或者带一些判断条件的语句,在C语言中提供了像这些的循环语句和分支语句

if else 语句

这是一种判断语句,他的格式如下

if(判断条件)
{
程序内容
}
 else if(判断条件)//另一种情况
{
程序内容
}
else//最后一种情况
{
程序内容
}

首先进入if语句如果条件为真那么就执行if语句里面的内容,如果为假就看看else if如果这里为真就执行else if里面的语句,如果这里为假就直接进入最后一种情况else语句里面

注意:如果if ,else if ,else下面只有一条语句则不用打括号,如果有2条以上的语句(包括两条)就必须要打大括号,但这里建议不管几条都可以打上大括号,这样也方便阅读代码行与行之间隔的更开。这里的第二个else 后面的if与最后一个else形成了一个嵌套if语句。有了嵌套if语句就可以完成我们更加复杂的条件判断

我们来举一个例子;

# define _CRT_SECURE_NO_WARNINGS
# include<stdio.h>
int main()
{
	int age = 0;
	scanf("%d", &age);
	if (age < 10)
	{
		printf("儿童\n");
	}
	else if (age < 18)
	{
		printf("青年\n");
	}
	else
	{
		printf("成年\n");
	}
	return 0;
}

这里就运用了判断条件来判断输入的年龄是儿童还是青年或者是成年

如果有多个 if 和 else ,可以记住这样⼀条规则, else 总是跟最接近的 if 匹配。

下面来再来看一个代码

# include<stdio.h>
int main()
{
	int a = 3;
	if (a > 5)
	   if (a > 2)
		printf("hehe\n");
	else
		printf("hello\n");

	return 0;
}

这里我们会产生一个误解首先看第一个判断条件不成立,然后就看第二个else成立让后打印hello,但我们运行程序之后就会发现什么都没有打印出来,这是为什么呢,那是因为在这里我们排版的时候让else 和第⼀个 if 语句对⻬,让我们以为 else 是和第⼀个if匹配的,当 if语句不成⽴的时候,⾃然想到的就是执⾏ else ⼦句,打印hello,但实际上但实际上 else 是和第⼆个 if进⾏匹配的,这样后边的 if…else 语句是嵌套在第⼀个 if 语句中的,如果第⼀个 if 语句就不成⽴,嵌套 if 和 else 就没机会执⾏了,最终啥都不打印。所以遇到这种情况我们可以这样记忆

如果有多个 if 和 else ,可以记住这样⼀条规则, else 总是跟最接近的 if 匹配。

改成这样就行了

# include<stdio.h>
int main()
{
	int a = 3;
	if (a > 5)
	{
		if (a > 2)
		{
			printf("hehe\n");
		}
		else
		{
			printf("hello\n");
		}
	}
	return 0;
}

这里就也说明了打大括号的好处在哪里

switch选择语句

除了 if 语句外,C语⾔还提供了 switch 语句来实现分⽀结构。switch 语句是⼀种特殊形式的 if…else 结构,⽤于判断条件有多个结果的情况。它把多重的 else if 改成更易⽤、可读性更好的形式。
他的格式是这样的

switch (expression) {
 case value1: statement
 case value2: statement
 default: statement
}

上⾯代码中,根据表达式 expression 不同的值,执⾏相应的 case 分⽀。如果找不到对应的值,
就执⾏ default 分⽀。
注意

switch 后的 expression 必须是整型表达式
•case 后的值,必须是整形常量表达式

我们写一个代码看看

# include<stdio.h>
int main()
{
	int n = 0;
	scanf("%d", &n);
	switch (n)
	{
	case 1:
		printf("hehe\n");
		break;
	case 2:
		printf("haha\n");
		break;
	}
	return 0;
}

这里我们用switch来判断n输入的值,如果是1就打印hehe,如果是2就打印haha,如果我们不在每个case后面输入break会怎么样呢,下面来看看
在这里插入图片描述

最终会变成这个样子这是为什么呢?原因是
switch 语句也是分⽀效果的,只有在 switch 语句中使⽤ break 才能在跳出 switch 语句,如果某⼀个 case 语句的后边没有 break 语句,代码会继续玩下执⾏,有可能执⾏其他 case语句中的代码,直到遇到 break 语句或者 switch 语句结束。就⽐如上⾯的代码就执⾏了 case 2 中的语句。
所以在 switch 语句中 break 语句是⾮常重要的,能实现真正的分⽀效果。
当然, break 也不是每个 case 语句都得有,这就得根据实际情况来看了。

#include <stdio.h>
int main()
{
 int day = 0;
 scanf("%d", &day);
 switch(day)
 {
 case 1case 2:
 case 3:
 case 4:
 case 5:
 printf("⼯作⽇\n");
 break;
 case 6:
 case 7:
 printf("休息⽇\n");
 break;
 }
 return 0;
 }

这段代码我们就没有在每个case后面使用break,照样完成我们判断日期是工作日还是休息日。
switch语句中的default
在使⽤ switch 语句的时候,我们经常可能遇到⼀种情况,⽐如 switch 后的表达式中的值⽆法匹
配代码中的 case 语句的时候,这时候要不就不做处理,要不就得在 switch 语句中加⼊default ⼦句。
格式是这样的

switch (expression) {
 case value1: statement
 case value2: statement
 default: statement
 }

switch 后边的 expression 的结果不是 value1 ,也不是 value2 的时候,就会执⾏default ⼦句。
我们还是拿上面的代码来稍作调整

#include <stdio.h>
int main()
{
 int day = 0;
 scanf("%d", &day);
 switch(day)
 {
 case 1case 2:
 case 3:
 case 4:
 case 5:
 printf("⼯作⽇\n");
 break;
 case 6:
 case 7:
 printf("休息⽇\n");
 break;
 default:
 printf("输⼊错误,请重新输入\n");
 break;
 }
 return 0;
 }

switch语句中的case和default的顺序问题
在 switch 语句中 case ⼦句和 default ⼦句有要求顺序吗? default 只能放在最后吗?
其实,在 switch 语句中 case 语句和 default 语句是没有顺序要求的,只要你的顺序是满⾜实
际需求的就可以。不过我们通常是把 default ⼦句放在最后处理的。根据个人情况来看

while循环

和前面两个语句相比这个就不一样了这个就不是选择语句而是循环语句了C语⾔提供了3种循环语句, while 就是其中⼀种,接下来就介绍⼀下 while 语句,while 语句的语法结构和 if 语句⾮常相似。

while(表达式)
 语句;//如果循环体想包含更多的语句,可以加上⼤括号

我们来看看while语句到底是怎么用的,来画一个图看看
在这里插入图片描述

⾸先上来就是执⾏判断表达式,表达式的值为0,循环直接结束;表达式的值不为0,则执⾏循环语
句,语句执⾏完后再继续判断,是否进⾏下⼀次判断。
下面我们来写一个程序看看;

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

这里我们用while循环来打印出0到10的数字
同样我们也可以写一个判断一个数是几位数的程序

#include <stdio.h>
int main()
{
 int n = 0;
 scanf("%d", &n);
 while(n)//当n不等于0时
  {
 printf("%d ", n%10);
 n /= 10;
 }
 return 0;
 }

for循环

他的语句是这样的

 for(表达式1; 表达式2; 表达式3)
 语句;//如果循环体想包含更多的语句,可以加上⼤括号

表达式1 ⽤于循环变量的初始化
表达式2 ⽤于循环结束条件的判断
表达式3 ⽤于循环变量的调整

下面我们画个图看看
在这里插入图片描述
⾸先执⾏ 表达式1 初始化循环变量,接下来就是执⾏ 表达式2 的判断部分, 表达式2 的结果如果
==0(为假),则循环结束; 表达式2 的结果如果!=0则执⾏循环语句,循环语句执⾏完后,再去执⾏表 达式3 ,调整循环变量,然后再去 表达式2 的地⽅执⾏判断, 表达式2 的结果是否为0,决定循环是否继续。整个循环的过程中,表达式1初始化部分只被执⾏1次,剩下的就是表达式2、循环语句、表达式3在循环
我们来实践一下

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

while和for的比较
for 和 while 在实现循环的过程中都有初始化、判断、调整这三个部分,但是 for 循环的三个部
分⾮常集中,便于代码的维护,⽽如果代码较多的时候 while 循环的三个部分就⽐较分散,所以从形
式上 for 循环要更优⼀些。

do while 循环

在循环语句中 do while 语句的使⽤最少,它的语法如下:

do
 语句;
while(表达式)

while 和 for 这两种循环都是先判断,条件如果满⾜就进⼊循环,执⾏循环语句,如果不满⾜就跳
出循环;
⽽ do while 循环则是先直接进⼊循环体,执⾏循环语句,然后再执⾏ while 后的判断表达式,表
达式为真,就会进⾏下⼀次,表达式为假,则不再继续循环。
在这里插入图片描述
在 do while 循环中先执⾏图上的“语句”,执⾏完语句,在去执⾏“判断表达式”,判断表达式的
结果是真!,则继续循环,执⾏循环语句;判断表达式的结果为假,则循环结束。所以在 do while 语句中循环体是⾄少执⾏⼀次的,这是 do while 循环⽐较特殊的地⽅。
我们来试试看
在屏幕上打印出0到10的值

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

break和continue语句

在循环执⾏的过程中,如果某些状况发⽣的时候,需要提前终⽌循环,这是⾮常常⻅的现象。C语⾔中
提供了 break 和 continue 两个关键字,就是应该到循环中的。
1,break 的作⽤是⽤于永久的终⽌循环,只要 break 被执⾏,直接就会跳出循环,继续往后执
⾏。
2, continue 的作⽤是跳过本次循环 continue 后边的代码,在 for 循环和 while 循环中有所差异的。

while循环中的break和continue

break举例

#include <stdio.h>
int main()
{
	int i = 1;
	while (i <= 10)
	{
		if (i == 9)
			break;//当i等于9后,就执⾏break,循环就终⽌了就打印到8就结束了.
		printf("%d ", i);
		i = i + 1;
	}
	return 0;
}

在这里插入图片描述
打印了1,2,3,4,5,6,7,8后,当i等于9的时候,循环正 break 的地⽅终⽌,不再打印,不再循环。
所以 break 的作⽤就是永久的终⽌循环,只要 break 被执⾏, break 外的第⼀层循环就终⽌了。
那以后我们在循环中,想在某种条件下终⽌循环,则可以使⽤ break 来完成我们想要的效果。
continue运用举例
continue 是继续的意思,在循环中的作⽤就是跳过本次循环中 continue 后边的代码,继续进⾏
下⼀次循环的判断。
上⾯的代码,如果把 break 换成 continue 会是什么结果呢?

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

这点的continue当i = 9时就会跳过后面的i+1部分直接又来判断i==9又为真有跳过后面的内容这样i+1就一直到不了,就会陷入死循环。

for循环中的break和continue

break举例

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

在这里插入图片描述
continue举例

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

在这里插入图片描述
这里我们发现这里和while的情况截然不同,那是由于我们while是无法进入到循环调整部分,而for却可以。

所以在 for 循环中 continue 的作⽤是跳过本次循环中 continue 后的代码,直接去到循环的调
整部分。未来当某个条件发⽣的时候,本次循环⽆需再执⾏后续某些操作的时候,就可以使⽤ continue 来实现。

do while循环中的break和continue

这里的使用情况和while里面是一模一样的,可以自行调用上面的while程序进行调试看看。

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

通过上面的循环讲解,我们要学会合理的使用他这样可以达到事半功倍的效果!
如果本文有错误,欢迎指正!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/496952.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AcWing 800. 数组元素的目标和(哈希)

原题链接 哈希思路: 我们可以在输入 时把每个数存进哈希表里&#xff0c;对于每个输入的 b[i]看看 x−b[i]是否出现与哈希表即可。 图解 #include <iostream> #include <algorithm> #include <unordered_map> using namespace std;const int N 111111;in…

使用 Yoda 和 ClickHouse 进行实时欺诈检测

背景 Instacart 是北美领先的在线杂货公司,拥有数百万活跃的客户和购物者。在其平台上打击欺诈和滥用行为不仅对于维护一个值得信赖和安全的环境至关重要,也对保持Instacart的财务健康至关重要。在这篇文章中,将介绍了一个欺诈平台——Yoda,解释了为什么我们选择ClickHous…

Game Maker 更新|在 The Sandbox 使用烹饪模拟器!

我们很高兴向你介绍 Game Maker 的最新更新&#xff1a;烹饪模拟器模板&#xff01;让自己沉浸在令人兴奋的新游戏类型中&#xff0c;同时学习有趣的新机制。剖析和探索模板&#xff0c;考验你的开发技能&#xff01; 什么是烹饪模拟游戏&#xff1f; 近年来&#xff0c;随着《…

【JavaScript】数组 ② ( JavaScript 数组索引 | JavaScript 遍历数组 | 使用 for 循环遍历数组 )

文章目录 一、JavaScript 数组索引1、数组索引2、数组索引 - 代码示例 二、JavaScript 遍历数组1、使用 for 循环遍历数组2、使用 for 循环遍历数组 - 代码示例 一、JavaScript 数组索引 1、数组索引 在 JavaScript 中 , 数组 的 " 索引 " 又称为 " 下标 "…

考研数学|武忠祥学习包搭配《660》和《880》

一、660、880、三大计算简单分析 660题 这本题册具有高难度、综合度和深度&#xff0c;属于高质量的题材。我建议不要在基础阶段就着手解决其中的660题&#xff0c;因为这可能会影响你的信心。相反&#xff0c;你可以在基础阶段完成一轮学习后&#xff0c;将这些题目留到强化…

爬取肯德基餐厅查询中指定地点的餐厅数据

进入肯德基官网 代码编写 import requests import jsonif __name__ __main__:get_url http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?opkeywordheaders {User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/1…

极速体验DolphinScheduler 3.2.1 Standalone 版[一]

文章目录 极速体验DolphinScheduler 3.2.1 Standalone 版前置准备工作启动 DolphinScheduler Standalone Server解压并启动 DolphinScheduler登录 DolphinScheduler 启停服务配置数据库 极速体验DolphinScheduler 3.2.1 Standalone 版 Standalone 仅适用于 DolphinScheduler 的…

Dify安装使用说明

dify功能简介 dify可以说是一个功能不错的LLMOps&#xff0c;可以通过dify集中管理模型&#xff0c;可以通过界面创建AI应用&#xff0c;可以上传文档形成知识库&#xff0c;可以创建自定义工具&#xff08;API&#xff09;&#xff0c;并可以对外提供API。 相关功能类似Open…

电源噪声的起因及危害

对造成电源不稳定的根源进行简单分析如下,主要在于两个方面:一是器件高速开关状态下,瞬态的交变电流过大;二是电流回路上存在的电感。从表现形式上来看又可以分为三类:同步开关噪声(SSN),有时被称为Δi噪声,地弹(Ground bounce)现象也可归于此类(图1-a);非理想电…

题目 2898: 二维数组回形遍历

题目描述: 给定一个row行col列的整数数组array&#xff0c;要求从array[0][0]元素开始&#xff0c;按回形从外向内顺时针顺序遍历整个数组。如图所示&#xff1a; 代码: package lanqiao;import java.math.BigInteger; import java.util.*;public class Main {public static …

Python+Django+Yolov5路面墙体桥梁裂缝特征检测识别html网页前后端

程序示例精选 PythonDjangoYolov5路面墙体桥梁裂缝特征检测识别html网页前后端 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对《PythonDjangoYolov5路面墙体桥梁裂缝特征检测识别html网页前…

java注解的实现原理

首先我们常用的注解是通过元注解去编写的&#xff0c; 比如&#xff1a; 元注解有Target 用来限定目标注解所能标注的java结构&#xff0c;比如标注方法&#xff0c;标注类&#xff1b; Retention则用来标注当前注解的生命周期&#xff1b;比如source&#xff0c;class&…

PaddleOCR环境搭建、模型训练、推理、部署全流程(Ubuntu系统)

OCR场景应用集合&#xff1a;包含数码管、液晶屏、车牌、高精度SVTR模型、手写体识别等9个垂类模型&#xff0c;覆盖通用&#xff0c;制造、金融、交通行业的主要OCR垂类应用。 ​ 一、PaddleOCR环境搭建 ​ conda create -n ppocr python3.8​conda activate ppocr 进入paddle…

Unity之Mirror如何实现多人同步游戏一

前言 Mirror是一个出色的开源游戏网络库,可以用来制作局域网多人游戏,最初Mirror诞生于Unity早起的Unet,后来Unity把Unet给弃用了,但是Mirror在官方团队的努力下,一直不停地优化框架,并且承诺永远不收费,并持续优化。 Mirror最大特点是,服务器和客户端是一个项目,从…

成都正信晟锦:欠债的人不接电话找不到人怎么办

在借贷活动中&#xff0c;遇到欠债人不接电话、消失无踪的情况确实棘手。这不仅考验债权人的耐心&#xff0c;更是一场智慧与策略的较量。面对这种情形&#xff0c;我们应如何应对? 保持冷静&#xff0c;避免情绪化的行为&#xff0c;如频繁拨打电话或言语威胁&#xff0c;这可…

污水处理迈入3D可视化新时代:智慧环保触手可及

在科技日新月异的今天&#xff0c;环保事业也迎来了前所未有的发展机遇。污水处理作为环保领域的重要组成部分&#xff0c;其技术的革新与进步&#xff0c;对于保护水资源、维护生态平衡具有重要意义。 传统的污水处理机组往往存在着操作复杂、监控困难等问题&#xff0c;使得污…

java日志技术——Logback日志框架安装及概述

前言&#xff1a; 整理下学习笔记&#xff0c;打好基础&#xff0c;daydayup!!! 日志 什么是日志 程序中的日志&#xff0c;通常就是一个文件&#xff0c;里面记录的是程序运行过程中的各种信息&#xff0c;通过日志可以进行操作分析&#xff0c;bug定位等 记录日志的方案 程…

【每日一题】盛水容器

问题描述 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#xff1a;你不能倾斜容…

Java:接口应用(Comparable接口与比较器)

目录 1.引例2.Comparable接口使用3.Comparable接口的局限性4.使用comparaTo实现排序5.比较器&#xff08;Comparator接口&#xff09; 1.引例 class Student{private String name;private int age;public Student(String name, int age) {this.name name;this.age age;} } p…

SQL Server事务复制操作出现的错误 进程无法在“xxx”上执行sp_replcmds

SQL Server事务复制操作出现的错误 进程无法在“xxx”上执行“sp_replcmds” 无法作为数据库主体执行&#xff0c;因为主体 "dbo" 不存在、无法模拟这种类型的主体&#xff0c;或您没有所需的权限