带你窥探分支和循环语句全貌——这一篇就够了

CPLEX和Gurobi求解器背后的秘密武器:分支定界算法实战解析 本文深度解析了分支定界算法作为CPLEX和Gurobi等工业级求解器的核心引擎,如何从理论框架演变为处理百万级变量的实战系统。文章通过解读求解器日志、剖析节点选择与变量分支等核心策略,并结合作者提供的实战调优案例,揭示了如何通过参数调整优化算法性能,从而高效解决复杂的混合整数规划问题。 阅读详情

前言

在C语言中,语句可分为5类:表达式语句、函数调用语句、控制语句、复合语句、空语句。本篇将详细介绍控制语句。
控制语句用于控制程序的执行流程,以实现程序的各种结构方式(顺序结构、循环结构、选择结构),它们由特定的语句定义符组成。
C语言有9种控制语句,可分为以下三类:

  1. 条件判断语句也叫分支语句:if语句、switch语句
  2. 循环执行语句:do while语句、while语句、for语句
  3. 转向语句:break语句、goto语句、continue语句、return语句

1.分支语句(选择结构)

大学好好学习,校招拿到好offer,走上人生巅峰,迎娶白富美;不好好学习,毕业回家卖红薯;或其他。
这就是选择。
在这里插入图片描述

1.1 if语句

在C语言中,if语句即可以实现单分支,又可以实现多分支。那语法结构是怎么样呢?

//语法结构
//单分支
if(表达式)
     语句;
//多分支
if(表达式)
	语句1;
else
	语句2;
//更多分支
if(表达式1)
	语句1;
else if(表达式)
	语句2;
else
	语句3;

Tips:

  • 在C语言中,如果表达式结果为真,则语句执行。而C语言规定0表示假,非0表示真。
  • 如果上述表达式成立,要执行多条语句,要将代码块放在{ }中。
  • 当出现悬空else时,else和离它最近的if匹配,而非和它对其的else匹配。
  • 在判断常量表达式时(例如判断5和sum是否相等),建议读者写成5==sum(这样写可以防止读者在实际写代码的过程中,少写一个=,把判断语句写成赋值语句)

1.2 switch语句

switch语句也是一种分支语句,常常用于多分支的情况。
比如如果出现以下情况:
输入4-7,相应的输出星期四到星期七。
如果我们写成if…else if…else if…这种形式,无疑太过复杂。而C语言给出了一种好的解决方法——switch语句。

//switch语句
switch(整形表达式)
{
	语句项;		//语句项是一些case语句
}				//如下:
				//case 整型表达式:
				//		语句;

1.2.1 在switch语句中的break

在switch语句中,我们没办法直接实现分支,搭配break后才能实现真正的分支。
例如:我们要求输入4和5,输出weekday;输入6和7,就输出weekend
我们的代码可以这样实现:

#include <stdio.h>
int main()
{
	int day = 0;
	scanf("%d", &day);
	switch (day)
	{
	case 4:
	case 5:
		printf("weekday\n");
		break;
	case 6:
	case 7:
		printf("weekend\n");
		break;
	}
	return 0;
}
  • break的实际效果是将语句列表分为不同的分支部分。
  • switch()中只能是常量表达式。
  • 编程好习惯:在最后一个case语句后加一条break语句。(这样写可以避免在以后自己或他人要修改该代码时,在以前的最后一个case语句后面忘记添加break语句)

1.2.2 default语句

在实际过程中,如果表达式的值与所有的case标签的值都不匹配要怎么办呢?
其实也没什么,结构就是跳过所有语句罢了。但有意思的是, 程序并不会停止也不会报错(这种情况下,C不认为是个错误)。
如果不想忽略不匹配的所有标签,我们可以在语句列表中添加一条default语句。

  • 当switch表达式的值并不匹配所有case标签的值时,default后面的语句就会执行。

  • 每一个switch语句只能出现一条default语句

  • default语句可以出现在语句列表中的任何位置,执行时会像执行case标签一样执行default语句

  • 编程好习惯:在每一个switch语句中加一个default语句,甚至可以在后面再加一个break语句。

2. 循环语句

  • while
  • for
  • do while

下面我们来看一个简单的循环
在这里插入图片描述

2.1 while循环

在生活中很多情况是:同一件事需要完成多次,而if语句只能执行一次,那要怎么办呢?
C语言引入了while语句,可以实现循环。

while 语法结构:

while (表达式)
	循环语句;

while语句的执行流程图:

在这里插入图片描述
Instance:如何在屏幕上打印1-10的数字。
我们可以这样实现:

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

2.1.1 while语句中的break

break介绍

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

这些代码输出结果是什么呢?

在这里插入图片描述
总结:
break在while循环中的作用:
其实在循环中只要遇到break,就停止后期的所有的循环,直接终止循环,所以while中的break是用于永久终止循环的。

2.1.2 while语句中的continue

continue介绍

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

这段代码只是把break改成continue,代码输出结果是什么呢?

在这里插入图片描述

运行代码后我们发现除5之外,其他数字都正常输出。
总结:
continue在while中的作用就是:

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

2.2 for循环

首先我们来看for循环的语法:

2.2.1 语法

for(表达式1:表达式2:表达式3)
	循环语句;		
//表达式1为初始化部分,用于初始化循环变量的。
//表达式2为条件判断部分,用于判断循环什么时候终止
//表达式3为调整部分,用于循环部分的调整

for循环的执行流程图:
在这里插入图片描述

Tips:

  • 对比for循环和while循环,我们可以发现while循环中依然存在循环的三个必要条件,但由于风格的问题使得while循环的3个部分可能偏离较远,导致查找修改不够集中和方便。所以for循环的风格更甚一筹,使用频率也跟高。

  • 在for循环中,break和continue得意义和while循环是一样的。

  • 建议1:不可在for循环体内修改循环变量,防止for循环失去控制。

  • 建议2:for循环控制变量的取值采用“前闭后开区间”写法。

2.2.2 一些for循环变种

我们来看以下4段代码,看看结果如何,打印多少个hehe。

#include <stdio.h>
int main()
{
	//代码1
	for (;;)
	{
		printf("hehe\n");
	}
	//代码1运行,会死循环打印hehe

	//代码2
	int i = 0;
	int j = 0;
	for (; i < 10; i++) 
	{
		for (; j < i; j++)
		{
			printf("hehe\n");	//j初始化省略,j在第一次循环结束后会,不会从0开始,而是保持原来的值
		}
	}
	//代码2运行,打印10个hehe

	//代码3——使用多哥变量控制循环
	int x, y;
	for (x = 0, y = 0; x < 2 && y < 5; x++, y++)
	{
		printf("hehe\n");
	}
	//代码3运行,打印2个hehe
	return 0;
}
  1. for循环中,初始化和调整部分的省略就是什么都不做。
  2. for循环中,判断部分的省略意味着判断恒为真。

2.3 do…while()循环

2.3.1 do语句的语法

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

2.3.2 执行流程

在这里插入图片描述

2.3.3 do语句的特点

do语句循环时,至少执行一次,但场景有限,所以不经常使用。

#include <stdio.h>
int main ()
{
	int i = 1;
	do
	{
		printf("%d ", i);	//不管如何,先执行代码块中内容,在判断是否在执行
		i++;
	} while (i <= 10);
	return 0;
}

- do while语句中的break和continue的意义和while语句以及for语句效果是一样的。

3.goto语句

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

goto语句真正适合的场景如下:

for (...)
{
	for (...)
	{ ...
		for (...)
		{
			if (disaster)
				goto error;
		}
	}
}
error:
	if(disaster)
		//处理错误情况

结尾

本篇文章到这就结束了,希望能帮读者更好的了解控制结构的全貌,建立一个完整逻辑框架。创作不易,如果觉得本篇文章对你有帮助,记得点赞加关注哦。感谢你的支持!
C简单程序详解,带你快速入门C语言

C++ while循环实战:从猜数字游戏掌握循环结构与输入处理 循环结构是编程中的基础控制结构,它允许程序重复执行特定代码块,是实现自动化处理的核心机制。在C++中,while和do...while循环是两种常用的迭代方式,其原理在于通过条件表达式控制循环体的执行次数。掌握循环结构对于实现用户交互、数据处理和游戏逻辑等场景具有重要技术价值。例如,在游戏开发中,循环常用于构建游戏主循环,持续处理用户输入和更新游戏状态。本文以经典的猜数字游戏为例,深入解析while循环的实际应用,涵盖随机数生成、输入验证和循环控制等关键知识点,帮助初学者通过具体项目理解循环结构的设计与调试 阅读详情

相关推荐

深入解析ColdFire V3核心:流水线、分支加速与调试信号实战

在嵌入式系统开发中,处理器流水线架构是提升指令执行效率的核心技术。其基本原理是通过将指令处理过程划分为多个阶段并行执行,以隐藏指令取指延迟,从而提高吞吐率。分支预测与加速逻辑则通过预测程序流方向,减少因流水线清空带来的性能损失,这对于实时性要求高的应用至关重要。从技术价值看,理解流水线与分支机制有助于开发者编写对缓存和预取友好的代码,实现深度性能优化。在应用场景上,工业控制、汽车电子等领域的嵌入式系统尤其依赖高效、可预测的执行流。本文聚焦于ColdFire V3处理器,其采用解耦的双流水线设计,并集成了分支

weixin_34319817的博客 500

窥探计算机语言的冰山一角

介绍计算机语言的常识

the_living的博客 670

AI结构预测与演化分析:从蛋白质三维结构窥探真核细胞起源之谜

蛋白质三维结构是理解其功能与演化的关键,它比氨基酸序列更为保守,能揭示深远的同源关系。其预测原理基于物理能量函数与深度学习,通过分析共进化信号与空间约束生成原子坐标。这一技术的核心价值在于突破了序列比对的局限,能够发现“暗物质”蛋白质域,为生命起源等重大科学问题提供分子层面的证据。在计算生物学与结构生物信息学领域,结合AlphaFold2等AI工具进行大规模结构预测与比较,已成为研究蛋白质功能、互作网络及演化历史的重要手段。本文以阿斯加德古菌为例,探讨如何利用结构建模技术,系统性分析其蛋白质组中与真核生物复

weixin_30587927的博客 352

基本魔法语言分支和循环 (一) (C语言)

迄今为止,我们的咒语(程序)只是简单地将符文(语句)依次激活,效果单一而直接,显得僵硬迟钝。但真正的强大的魔法,在于控制与凝聚,灵活多变,能够更好的应对这个风诡波谲的世界。想象一下你有一个自动凝聚能量直至饱和的法阵,一个是能循环往复运转的魔法钟摆…你的魔法将告别死板,拥有真正的“灵魂”与“力量”。准备好施展你的第一个智能魔法了吗?

遇见,获得,失去,成长,释怀,完结。我与旧事归于尽,来年依旧迎花开。 1394

AI智能体状态感知循环:从Peekaboo技能看自动化交互新范式

在自动化技术领域,状态感知是提升系统适应性和鲁棒性的核心原理。传统脚本化操作依赖于固定的元素定位和预设流程,面对动态变化的用户界面时往往失效。状态感知循环通过持续观察、解析、决策、执行的闭环,使系统能够理解当前环境并动态调整行为,其技术价值在于实现了从“盲操作”到“智能交互”的范式转变。这一原理在机器人流程自动化(RPA)、软件测试和智能辅助工具等场景中尤为重要。本文探讨的Peekaboo技能,正是这一原理在AI智能体(AI Agent)中的具体实践,它通过集成视觉语言模型(VLM)和大语言模型(LLM),

weixin_26969967的博客 319

STM32F103C8T6与OV7670摄像头在TFT屏上的实时数字识别系统实现

本文详细介绍了基于STM32F103C8T6单片机和OV7670摄像头实现实时数字识别系统的全过程。系统通过图像采集、预处理、二值化和模板匹配算法,在TFT屏上实时显示识别结果,并针对资源受限的单片机环境提供了内存与性能优化策略,适用于智能家居、工业仪表读数等低成本嵌入式视觉应用场景。

open4的博客 278

深入理解C/C++中的指针、循环与分支

在C/C++编程中,指针和循环是两个至关重要的概念,它们在程序设计中发挥着关键作用。本文将深入探讨这两个主题,帮助读者更好地理解它们的原理和应用。

2301_76267566的博客 587

Frigate进阶玩法:如何用MQTT和Python脚本扩展你的自定义目标检测算法

本文详细介绍了如何通过MQTT和Python脚本扩展Frigate的自定义目标检测算法,无需修改源码即可实现特殊场景(如工业设备异常、农业病虫害识别)的高效检测。文章涵盖Frigate配置、外部检测服务构建、高级集成技巧及性能优化实践,帮助开发者灵活扩展智能监控能力。

weixin_42662293的博客 348

窥探Swift编程之强大的Switch

  之前初识Swift中的Switch语句时,真的是让人眼前一亮,Swift中Switch语句有好多特有而且特好用的功能。说到Switch, 只要是写过程序的小伙伴对Switch并不陌生。其在程序中的出镜率还是比较高档。Switch属于程序的分支语句,Switch的功能便于处理多个分支的较为复杂点的逻辑分支。能用Switch实现的代码都可以使用多个if-else分支语句进行替换。   今天这篇博...

weixin_33754913的博客 160

单细胞实战之数据净化三部曲:细胞周期校正、双胞体剔除与RNA污染清理——技术解析与实战指南

本文深入解析单细胞数据分析中至关重要的数据净化步骤,即细胞周期校正、双胞体剔除与RNA污染清理。通过实战代码演示与原理剖析,指导读者如何有效识别并去除技术噪音,从而获得更纯净、可靠的数据,为后续的细胞分群、差异表达等高级分析奠定坚实基础。

weixin_29274337的博客 204

国产谷歌地球,地形分析秒杀同款地图软件

咱们做地质、林业、水文、水利、电力、GIS、地图、水保、环境的,需要经常用到各种数据,比如影像、地形、矢量、模型等,但目前80%的规划大数据展示都离不开ArcGIS,令人头大的是很多朋友连ArcGIS软件安装起来都费劲。。。 那不会ArcGIS又装不了Google Earth怎么开展工作? 今天推荐大家一款国产免费专业地图浏览下载测量分析神器—图新地球 图新地球,国产三维gis软件。可以查看高清卫星影像地形以及其他很多常用电子地图,对地图需求的掌握远胜过Google Maps,而且上手比国外软件要简单

GISWorld3D的博客 3685

从join的实现窥探MySQL迭代器

以如下left join查询语句为范例: select * from t1 left join t2 on t1.c=t2.a ;以下初始化数据: 1 DROP TABLE IF EXISTS `t1`; 2 CREATE TABLE `t1` ( 3 `a` int DEFAULT NULL, 4 `b` varchar(20) DEFAULT NULL 5 ) 6 INSERT INTO `t1` VALUES (1, 'a'); 7 INS

GreatSQL2021的博客 394

手把手教你用Qt和QScada框架,从零搭建一个简易的工业组态监控界面

本文详细介绍了如何使用Qt和QScada框架从零搭建工业组态监控界面,涵盖环境配置、界面设计、动态数据绑定及高级功能实现。通过实战案例演示,帮助开发者快速掌握SCADA系统开发技巧,提升工业自动化项目的开发效率。

weixin_32932149的博客 340

PHP基础语法

本篇文章主要讲解PHP基础语法

没有网络安全就没有国家安全 2415

人形机器人解耦驱动腿部设计与FAST性能优化

机器人运动控制的核心在于动力学解耦与能量效率优化。通过多连杆机构设计,可以实现关节运动的独立控制,显著降低惯性叠加和能量损耗。DecARt Leg采用创新的齿轮-四杆复合机构,将腿部伸缩与摆动运动完全解耦,配合多杆踝关节传动系统,实测行走速度可达4.18m/s。这种解耦设计不仅提升了动态性能,其提出的FAST指标更为腿部构型提供了量化评估基准,在仓储物流、地形适应等场景展现出显著优势,为人形机器人运动控制提供了新的技术路径。

weixin_33759613的博客 237

Simulink开发项1000例实战专栏--实例148:构建一个完整的电动汽车电池SOH评估仿真模型,包括电池建模模块、数据采集模块、SOH估算算法模块以及性能评估模块

电动汽车的动力电池是其核心部件,而电池的健康状态(State of Health, SOH)直接影响车辆的续航能力和使用寿命。SOH通常定义为当前电池容量与初始容量的比值,用百分比表示。通过基于MATLAB/Simulink平台的SOH评估仿真,可以实时监测电池的退化情况,并为电池管理系统(BMS)提供决策依据。本项目旨在构建一个完整的电动汽车电池SOH评估仿真模型,包括电池建模模块、数据采集模块、SOH估算算法模块以及性能评估模块,并通过仿真验证SOH评估的准确性。

xiaoheshang_123的博客 341

C++编译器优化利器:__builtin_expect分支预测实战指南

在计算机体系结构中,指令流水线和分支预测是提升CPU执行效率的核心机制。现代CPU通过流水线并行处理指令,但条件分支会导致流水线停顿,分支预测器则通过历史记录猜测执行路径以减少性能损失。其技术价值在于通过优化指令布局和缓存利用率,显著降低因预测失败产生的流水线清空惩罚。这一原理在编译器优化中尤为重要,开发者可以通过静态提示辅助动态执行。应用场景广泛覆盖系统底层开发、游戏引擎、高频交易等对性能有极致要求的领域。本文聚焦GCC/Clang的__builtin_expect内建函数,详解如何通过likely/un

weixin_34059951的博客 692

使用 Python 和蒙特卡罗计算未来股价走势以及历史波动率和隐含波动率

蒙特卡罗模拟等工具使投资者能够洞察一系列潜在的未来。这远离了单纯的猜测,迈向了明智的、数据驱动的决策。

探索人工智能领域 706

C生万物 | 底层之美 · 包罗万象【1024,再度起航】

13个C语言知识点大模块,分篇精讲叙述,1024一起Coding全场

做技术人 · 产优质博客 · 找好工作 4005

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

明解c语言实践篇翻译_《明解C语言》PDF版本下载

一、目录介绍第1章 初识C语言1—1 显示计算结果计算整数的和并显示结果 2程序和编译 2注释 3固定代码 4格式化输出函数printf 4语句 5计算并显示整数的差 5格式化字符串和转换说明 6符号的称呼 7无格式化输出 8字符串常量 9转义字符 91—2 变量常量和变量 10声明多个变量 11赋值 111—3 输入和显示通过键盘进行输入 12格式化输入函数scanf 12乘法运算 13输出函数...

weixin_39917211的博客 2557

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

训练数据零泄露承诺背后:Seedance 2.0 双分支架构的4层隐私沙箱设计(含PyTorch级实现伪码)

破解训练数据泄露难题,Seedance 2.0双分支扩散变换器架构解析聚焦安全隐私策略,通过4层隐私沙箱(数据隔离、梯度掩蔽、参数冻结、输出净化)实现端到端零泄露。适用于医疗、金融等高敏场景,PyTorch级伪码可直接复现,值得收藏。

LearnFlow的博客 306

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

c语言明解(五)程序的循环控制,明解C语言

第1章初识C语言1-1显示计算结果计算整数的和并显示结果程序和编译注释固定代码格式化输出函数printf语句计算并显示整数的差格式化字符串和转换说明符号的称呼无格式化输出字符串常量转义字符1-2变量常量和变量声明多个变量赋值1-3输入和显示通过键盘进行输入格式化输入函数scanf乘法运算输出函数puts第2章运算和数据类型2-1运算四则运算运算符和操作数商和余数乘除运算符和加减运算符使用print...

weixin_42181686的博客 283

基于双分支视觉Transformer的EEG情绪识别模型:Bi-ViTNet架构详解与工程实践

脑电图信号分析是理解大脑活动的核心技术,通过记录神经元电活动,为情绪识别等认知研究提供了客观依据。其原理在于从时域、频域和空域多维度解析微弱的生物电信号,技术价值在于克服了传统面部表情、语音等外部信号易受主观掩饰的局限。在应用场景上,EEG情绪识别正推动着脑机接口、心理健康监测、智能交互等领域的创新。本文聚焦的Bi-ViTNet模型,创新性地引入Transformer架构,通过自注意力机制有效捕获脑电信号中的长程依赖关系,并设计了并行的时空与空频双分支,实现了多域特征的深度融合,显著提升了情绪解码的准确性与

weixin_33046983的博客 360

嵌入式处理器架构演进:从可变长度RISC到MCF5102的桥梁设计

在嵌入式系统开发中,处理器架构的选择直接影响着性能、功耗与成本。RISC(精简指令集计算机)架构以其规整的流水线和高效执行著称,但在嵌入式场景下,其固定长度指令导致的代码密度低问题,会增大存储成本并影响取指效率。为解决这一痛点,可变长度指令集技术应运而生,它通过动态调整指令编码长度,在保持RISC内核高效性的同时,显著提升了代码密度,降低了系统物料成本。这一技术革新为嵌入式设备在通信、工业控制等对成本、功耗敏感的应用场景中,提供了更优的解决方案。MCF5102作为这一理念的早期实践者,其可变长度RISC架构

weixin_30363509的博客 429

怎么样用Redis构建自己的代码帝国?(Redis的架构和核心原理)

本文介绍了 Redis 核心原理和架构:基于事件驱动的模型。事件模型是构成 Redis 内核的引擎,Redis 的丰富功能和组件都是构建在这个模型上的。如果你使用过 Redis,那么本文可以为你打开一道进入 Redis 内部世界的门,窥探 Redis 如何构建它的帝国。 本文先对 Redis 使用的事件模型和原理进行介绍,然后按以下主题顺序展开: Redis 主程序启动流程 事件循环(eve...

awumbuk的博客 383

性能优化底层密码:从汇编指令看现代编译器的优化策略

本文深入探讨了如何通过分析汇编语言理解现代编译器的性能优化策略。文章详细解析了指令选择、循环优化、内存访问模式和向量化等关键技术,揭示了编译器如何将高级代码转换为高效机器指令,为开发者提供了性能优化的底层视角和实践指导。

l3m4n的博客 663
上一篇: C语言难?深度剖析第一段C语言代码—带你快速入门C语言
下一篇: 数据和C——万字详解(C Primer Plus)
小白debug~
小白debug~ 新星创作者: C/C++技术领域 新星创作者: C/C++技术领域
博客等级 码龄4年 3510粉丝 128原创
评论 17
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白debug~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值