C 语言分支与循环

 

目录

 一. 分支结构:if 语句与 switch 语句

1. if 语句

2. switch 语句 

二、关系操作符、条件操作符与逻辑操作符 

1. 关系操作符

2. 条件操作符

3. 逻辑操作符

三、循环结构:while 循环、for 循环与 do - while 循环 

1. while 循环

2. for 循环

3. do - while 循环

四、break 和 continue 语句:循环控制的利器

(一)break 语句

(二)continue 语句

五、循环的嵌套与 goto 语句

(一)循环的嵌套

(二)goto 语句


    在 C 语言的世界里,分支和循环结构编程的核心内容,它们赋予了程序根据不同条件执行不同操作以及重复执行特定代码段的能力,让程序变得更加智能和高效。今天,我们就深入探讨 C 语言分支和循环的相关知识,助力大家夯实编程基础。

 一. 分支结构:if 语句与 switch 语句

1. if 语句

    1.1 基本形式与原理

    if 语句是 C 语言中最常用的分支结构之一。其基本语法为if (表达式) 语句,当表达式的值为非 0(在 C 语言中,非 0 表示真)时,执行后面的语句;若表达式的值为 0(表示假),则语句不执行 。例如,在判断一个整数是否为奇数的代码中:

int main()
{int num = 0;scanf("%d", &num);if(num % 2 == 1)printf("%d是奇数\n", num);return 0;
}

    这里通过num % 2 == 1这个表达式来判断num是否为奇数,若满足条件则打印相应信息。

    1.2 if...else... 结构

    为了更全面地进行条件判断,if...else...结构应运而生。语法为if (表达式) 语句1 else 语句2,当表达式为真时执行语句1,否则执行语句2。以判断整数是奇数还是偶数为例: 

int main()
{int num = 0;scanf("%d", &num);if(num % 2 == 1)printf("%d是奇数\n", num);elseprintf("%d是偶数\n", num);return 0;
}

     1.3 控制多条语句

        默认情况下,ifelse语句只控制一条语句。若要控制多条语句,需使用大括号{}将代码括起来,形成程序块或复合语句。例如:

    int main()
    {int age = 0;scanf("%d", &age);if(age >= 18) {printf("成年了\n");printf("可以谈恋爱了\n");}else {printf("未成年\n");printf("不可以早恋哦\n");}return 0;
    }

    1.4 嵌套if语句:

    if else语句中,else可以与另一个if语句连用,构成嵌套 if 语句,实现更复杂的逻辑判断。比如判断一个整数是 0、正数还是负数:

    int main()
    {int num = 0;scanf("%d", &num);if(num == 0)printf("输入的数字是0\n");else if(num > 0) printf("输入的数字是正数\n");elseprintf("输入的数字是负数\n");return 0;
    }

    1.5 悬空 else 问题:

        当存在多个ifelse时,else总是与最接近的if匹配。例如:

    int main()
    {int a = 0;int b = 2;if(a == 1)if(b == 2)printf("hehe\n");elseprintf("haha\n");return 0;
    }

        这段代码中,else实际上与第二个if匹配,若想让else与第一个if匹配,需添加大括号,增强代码可读性

    2. switch 语句 

    2.1 基本形式和应用场景:

      switch语句是另一种实现分支结构的方式,适用于判断条件有多个结果的情况。其语法为:       

      switch (expression)

      { 

        case value1: statement;

        case value2: statement;

        default: statement;

      }

        根据expression的值执行相应的case分支,若找不到匹配值,则执行default分支。例如,计算整数除 3 之后的余数:

    int main()
    {int n = 0;scanf("%d", &n);switch(n%3){case 0:printf("整除,余数为0\n");break;case 1:printf("余数是1\n");break;case 2:printf("余数是2\n");break;default :printf("没有匹配的值");break;}return 0;
    }

        n%3的计算结果如果等于0 1 2就执行相应的语句,没有相等的值就执行default后面的语句

    2.2 break 的重要性

        在switch语句中,break用于跳出switch语句。若某case语句后没有break,代码会继续执行后续case语句,直到遇到breakswitch语句结束。例如,去掉上述代码中的break,会出现不符合预期的结果。

    2.3 default 子句

        当switch后的表达式的值无法匹配代码中的case语句时,可使用default子句进行处理。比如在打印星期的练习中,可用于提示输入错误。

    2.4 case 和 default 的顺序

      switch语句中case子句和default子句没有严格的顺序要求,但通常将default子句放在最后。

    二、关系操作符、条件操作符与逻辑操作符 

    1. 关系操作符

        C 语言中的关系操作符包括><>=<===!=,用于比较两个值的大小或是否相等,构成关系表达式。关系表达式的结果通常为 0(假)或 1(真) 。使用时需注意,相等运算符==与赋值运算符=不同,同时应避免多个关系运算符连用。例如,判断年龄是否在 18 岁到 36 岁之间,正确的写法是if(age>=18 && age<=36),而不是if(18<=age<=36)

    int main()
    {int age = 30;if(age>18){printf("长大了");}else{printf("小孩");}return 0;
    }

    2. 条件操作符

        条件操作符也叫三目操作符,形式为exp1? exp2: exp3。其计算逻辑是:若exp1为真,计算exp2,其结果为整个表达式的结果;若exp1为假,计算exp3,其结果为整个表达式的结果。

    int main()
    {int a = 3;int b = 4;int c = a > b ? 3 : 4;//如果a大于b给c赋值3,反之,赋值4printf("%d",c);return 0;
    }

    3. 逻辑操作符

        3.1 逻辑取反运算符!

        用于改变单个表达式的真假。例如,若flag为假,执行特定操作:

    int main()
    {int flag = 0;if(!flag){printf("do something\n");}return 0;
    }
    

        3.2 逻辑与运算符&&

        表示并且的意思,只有当两侧表达式都为真时,整个表达式才为真。如判断月份是否在 3 月到 5 月(春天):if(month >= 3 && month <= 5)

    int main()
    {int month = 4;if(month >= 3 && month <= 5)//两个条件同时满足就执行下面的语句{printf("春天");}else{ ;}return 0;
    }

        3.3 逻辑或运算符 ||:

        表示或者的意思,只要两侧表达式至少有一个为真,整个表达式就为真。如判断月份是否是 12 月、1 月或 2 月(冬天):if(month == 12 || month==1 || month == 2)

      

    int main()
    {int month = 4;if(month == 3 || month == 5 || month== 4)//三个条件满足一个就执行下面的语句{printf("春天");}else{ ;}return 0;
    }

        3.4 短路现象:

        C 语言逻辑运算符具有短路特性,总是先对左侧表达式求值,再对右侧表达式求值。若左侧表达式满足逻辑运算符的条件,就不再对右侧表达式求值。例如,在if(month >= 3 && month <= 5)中,当month >= 3为假时,就不再判断month <= 5

        三、循环结构:while 循环、for 循环与 do - while 循环 

        1. while 循环

            语法与执行流程while循环的语法为while(表达式) 语句。执行时先判断表达式的值,若为 0 则循环结束,若为非 0 则执行循环语句,之后再次判断表达式,如此循环。

           

            实践应用:例如,在屏幕上打印 1 到 10 的值:

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

            练习:输入一个正整数,逆序打印其每一位。通过n%10获取最低位,n=n/10去掉最低位,利用while循环实现

        int main()
        {int a = 1234;while (a){printf("%d ", a % 10);a = a / 10;}return 0;
        }

        2. for 循环

         

            语法与执行流程for循环的语法为for(表达式1; 表达式2; 表达式3) 语句。其中,表达式1用于循环变量的初始化,表达式2用于循环结束条件的判断,表达式3用于循环变量的调整 。执行时先执行表达式1,再判断表达式2,若为真则执行循环语句,之后执行表达式3,然后再次判断表达式2,直到表达式2为假时循环结束。

            实践应用:同样是在屏幕上打印 1 到 10 的值,for循环的代码为:

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

            与 while 循环的对比for循环和while循环都有初始化、判断、调整三个部分,但for循环的这三个部分更集中,便于代码维护,在形式上更具优势

            

            练习:计算 1 到 100 之间 3 的倍数的数字之和,可通过优化循环直接产生 3 的倍数来提高效率。

        int main()
        {int sum = 0;for (int i = 3; i <= 100; i = i + 3){sum = sum + i;}printf("%d ", sum);return 0;
        }

        3. do - while 循环

            语法与执行流程do - while循环的语法为do 语句; while(表达式);。它先执行循环体语句,再判断表达式的值,若为真则继续循环,若为假则结束循环。其特点是循环体至少执行一次。

            

            实践应用:在屏幕上打印 1 到 10 的值,代码如下:

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

        练习:输入一个正整数,计算其位数。使用do - while循环,因为即使输入的数是 0,也可作为 1 位数统计

        int main()
        {int a = 0;int i = 0;scanf("%d", &a);do{a = a / 10;i++;} while (a);printf("%d", i);return 0;
        }

          四、break 和 continue 语句:循环控制的利器

          (一)break 语句

              break用于永久终止循环,一旦执行,直接跳出所在循环,继续执行循环后面的代码。在whilefordo - while循环中作用相同。例如,在while循环中,当i等于 5 时终止循环:

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

          (二)continue 语句

            continue用于跳过本次循环中continue后面的代码,直接进入下一次循环的判断。在while循环和for循环中表现略有不同,在while循环中跳到循环判断位置,而在for循环中会跳到循环调整部分。

          五、循环的嵌套与 goto 语句

          (一)循环的嵌套

              三种循环(whiledo - whilefor)可以相互嵌套,解决更复杂的问题。例如,找出 100 到 200 之间的素数,需要使用两层循环,外层循环遍历 100 到 200 的数字,内层循环判断每个数字是否为素数。

          int main()
          {for (int i = 100; i <= 200; i++){int falg = 0;for (int j = 2; j < i - 1; j++){if (i % j == 0){falg = 1;break;}}if (falg == 0){printf("%d ", i);}}return 0;
          }

          (二)goto 语句

            goto语句可以实现在同一个函数内跳转到设置好的标号处。虽然使用不当会打乱程序执行流程,但在多层循环中,若想快速跳出循环,goto语句会更加便捷。

          int main()
          {printf("hehe\n");goto next;printf("haha\n");next:printf("跳过了haha的打印\n"); return 0;
          }

          通过对 C 语言分支和循环知识的详细介绍,相信大家对这些重要的编程概念有了更深入的理解。在实际编程中,灵活运用这些知识,能够编写出更高效、更复杂的程序。希望大家不断练习,提升自己的编程技能!

          练习:

           线段图案_牛客题霸_牛客网

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

          如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

          相关文章

          【一文看懂Spring Boot2.x升级Spring Boot3.x】springboot2.x升级springboot3.x

          springboot2.x升级springboot3.x 背景升级jdk版本为17以上springboot版本修改javax包更新mybatis-plus升级swagger升级springdocspringdoc配置背景 当前项目是springboot2.5.9版本的springboot+mybatis-plus项目,需要升级到springboot3.5.0项目。 升级jdk版本为17以上 Spri…

          阳台光伏防逆流电表革新者:安科瑞ADL200N-CT/D16-WF

          ——为家庭能源管理提供高精度、智能化解决方案 一、阳台光伏爆发的背景 在全球能源转型与碳中和目标的驱动下&#xff0c;阳台光伏正以革命性姿态重塑家庭能源消费模式。从欧洲的“微型发电站”到中国的“万亿蓝海”&#xff0c;这一创新技术不仅撬动了能源市场的结构性变革…

          美团完整面经

          面试岗位 面试的岗位 - 2025春季校招 【转正实习】软件服务工程师-后端方向&#xff08;成都 - 软硬件服务-SaaS事业部&#xff09; 一面&#xff08;业务初试 - 30min&#xff09; 问题 自我介绍 Java基础 HashMap底层用的数据结构是什么&#xff1f;是线程安全的吗&…

          pysnmp 操作流程和模块交互关系的可视化总结

          1. SNMP GET 操作序列图 #mermaid-svg-KALvv8WkHJTsNCeu {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-KALvv8WkHJTsNCeu .error-icon{fill:#552222;}#mermaid-svg-KALvv8WkHJTsNCeu .error-text{fill:#552222;str…

          关于 /proc/net/tcp 与 /proc/$pid/net/tcp 的关系分析

          关于 /proc/net/tcp 与 /proc/$pid/net/tcp 的关系分析 1. 基础概念 在 Linux 系统中&#xff0c;每个进程必定归属于一个且仅一个网络命名空间&#xff08;Network Namespace&#xff09;。这是 Linux 命名空间隔离机制的核心特性之一。 /proc/net/tcp 显示当前网络命名空间…

          微信小程序 - 保存手机号等信息到通讯录

          主要使用小程序 wx.addPhoneContact 这个api 一、界面 <view class"tab-item" bindtap"addToPhoneContacts">保存</view> 二、js 逻辑文件中 addToPhoneContacts() {wx.addPhoneContact({firstName: this.data.firstName, // 姓名mobilePh…

          计算机视觉一些定义解析

          1.GCT&#xff08;Gated Channel Transformation&#xff09; 定义 GCT&#xff08;Gated Channel Transformation&#xff09;是一种用于增强卷积神经网络特征提取能力的模块。它的核心思想是通过门控机制对特征图的通道进行动态调整&#xff0c;从而突出对任务更有帮助的特…

          美团NoCode的Database 使用指南

          系列文章目录 第一篇&#xff1a;美团NoCode设计网站的尝试经验分 第二篇&#xff1a;美团NoCode中的Dev Mode 使用指南 文章目录 系列文章目录Database 适用场景一、什么是 Database&#xff1f;二、准备流程1. 申请账号 三、使用流程1.申请资源的同时可搭建 NoCode 页面&…

          MVC 数据库

          MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…

          1.11 HTTP 文件上传的核心协议

          HTTP 文件上传是 Web 开发中的常见需求&#xff0c;涉及到特殊的请求格式和处理机制。 一、HTTP 文件上传的核心协议 1. 两种主要方式 multipart/form-data&#xff08;主流&#xff09; 支持二进制文件和表单字段混合传输&#xff0c;由 Content-Type 头部标识。applicatio…

          安装 Poppler(Windows)

          下载 Poppler&#xff08;Windows&#xff09;&#xff1a;https://github.com/oschwartz10612/poppler-windows/releases/ 解压在自己目录下 配置系统环境变量&#xff1a;把 poppler-xx.x.x\bin 目录加入你的环境变量 PATH 中。 检查是否配置成功 pdfinfo

          Java学习笔记之:初识nginx

          Java学习笔记之&#xff1a;初识nginx PS&#xff1a;虽然总结的都很简单&#xff0c;但是作为初学者并且本人记忆力较差所以每次学习新知识点后习惯性记录下来&#xff0c;这样加深一遍记忆并且便于日后复习。 介绍&#xff1a; Nginx是一款轻量级的Web服务器/反向代理服务器…

          Middleware

          中间件的定义&#xff1a;中间件是位于操作系统和应用程序之间的软件层&#xff0c;用于解决分布式系统中通信、数据共享、资源管理等共性问题。消息队列属于通信中间件&#xff0c;用于在分布式系统中传递消息&#xff0c;实现应用解耦、异步通信和流量削峰。解耦系统&#xf…

          Mac如何配置ZSH并使用Oh-my-zsh?让你的终端更加实用、美观

          前言 现在&#xff0c;越来越多的人趋向使用ZSH取代(Linux)原本的Bash作为自己的终端Shell。的确&#xff0c;ZSH才是适用于现代的Shell&#xff1a; 更丰富的命令提示更鲜明的演示标记更强大的插件支持 什么是ZSH 回答什么是ZSH前&#xff0c;我们先解释什么是Bash&#x…

          C++11新标准

          重点 auto 类型推导范围 for 迭代初始化列表变参模板 新类型 C11新增了类型 long long 和 unsigned long long&#xff0c;以支持64位(或更宽)的整型;新增了类型 char16_t和 char32_t&#xff0c;以支持 16位和 32 位的字符表示;还新增了“原始”字符串。 常量 nullptr nu…

          SpringAI Prompt提示词

          基本概念 Prompts提示词 ❝ 提示词的是引导AI模型输出的输入&#xff0c;提示词的正确性直接影响模型输出的。 Message消息 Message 接口封装了 Prompt 文本内容、一组元数据属性以及称为 MessageType 的分类。Spring AI消息API&#xff1a; 其中最重要的就是角色&#xff1a; …

          力扣刷题——二分查找

          数组是存放在连续内存空间上的相同类型数据的集合数组下标都是从0开始的数组内存空间的地址是连续的正是因为数组在内存空间的地址是连续的&#xff0c;所以我们在删除或者增添元素的时候&#xff0c;就难免要移动其他元素的地址。 使用二分查找法返回的元素下标可能不是唯一的…

          黑群晖NAS部署DeepSeek模型与内网穿透实现本地AI服务

          文章目录 前言1.安装Container Manager2. 启动ssh功能3. ssh连接黑群晖4. 安装Ollama5. 安装deepseek模型6. 安装open-webui图形界面7. 安装内网穿透7.1 下载cpolar套件7.2 配置群辉虚拟机7.3 配置公网地址小结 7.4 配置固定公网地址 总结 前言 在追求自建网络存储方案的极客群…

          Rust 学习笔记:处理任意数量的 future

          Rust 学习笔记&#xff1a;处理任意数量的 future Rust 学习笔记&#xff1a;处理任意数量的 future竞争的 future将控制权交给运行时构建我们自己的异步抽象 Rust 学习笔记&#xff1a;处理任意数量的 future 当两个 future 切换到三个 future 时&#xff0c;我们也必须从使用…

          2025年TCP洪水攻击防护实战全解析:从协议对抗到AI智能防御

          一、2025年TCP洪水攻击的新特征与挑战 AI驱动的自适应攻击 攻击者利用生成式AI动态调整SYN报文特征&#xff08;如载荷内容、发送频率&#xff09;&#xff0c;使攻击流量与正常业务流量的差异率低至0.5%&#xff0c;传统基于规则引擎的防御策略完全失效。 混合协议打击常态化…