news 2026/7/11 12:21:28

C语言学习笔记——分支与循环

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C语言学习笔记——分支与循环

目录

  • 1 if语句
    • 1.1 if
    • 1.2 else
    • 1.3 else if
    • 1.4 注意事项
      • 1.4.1 注意事项1
      • 1.4.2 注意事项2
  • 2 switch语句
    • 2.1 switch
    • 2.2 注意事项
      • 2.2.1 空格问题
      • 2.2.2 break
      • 2.2.3 default 语句的位置
  • 3 条件判断常用运算符
    • 3.1 关系运算符
    • 3.2 逻辑运算符
      • 3.2.1 &&运算符(逻辑与)
      • 3.2.2 ||运算符(逻辑或)
      • 3.2.3 !运算符(取反)
  • 4 while 循环
  • 5 for 循环
  • 6 do...while循环
  • 7 循环中常用关键字
    • 7.1 break
    • 7.2 continue
      • 7.2.1 while中的continue
      • 7.2.2 for中的continue
      • 7.2.3 do...while中的continue

在C语言中,分支语句主要有if语句,switch语句两种,而循环语句主要有while循环,for循环,do…while循环两种。接下来,就来介绍一下这些语句

1 if语句

1.1 if

if 语句在C语言中的写法如下:

if(表达式)内部语句;....//其它代码

if的执行流程为:若表达式(条件)为,则会执行内部语句,若表达式(条件)为,则不会执行内部语句,而是继续执行后方代码。在C语言中,非0的数值表示真,0则表示假

实践:判断一个数是否为正数
有了 if 语句,就可以进行条件判断,所以方法就是让用户输入一个数值,让 if 语句判断数值是否 >0,>0 则输出是正数

#include<stdio.h>intmain(){intnum=0;scanf("%d",&num);if(num>0)//大于0,是正数{printf("是正数");}return0;}

1.2 else

else 的用法如下:

if(表达式)内部语句;else内部语句;...//其它语句

当 if 的表达式结果为,if 的内部语句就不会执行,会转而去执行 else 的内部语句,而 if 的表达式结果为,则 if 的内部语句会执行,else 的内部语句不会执行

实践:判断一个数是奇数还是偶数
让用户输入一个数值,使用if…else 语句,让 if 语句判断数值 % 2 是否等于0, = 0 则表明2是因子,输出是偶数,否则通过else来输出是奇数

#include<stdio.h>intmain(){intnum=0;scanf("%d",&num);if(num%2==0)//2是因子,是偶数{printf("是偶数");}else//否则就是奇数{printf("是奇数");}return0;}

1.3 else if

else if 的写法如下:

if(表达式1)内部语句;elseif(表达式2)内部语句;...//其它语句

如果表达式1为,则会执行if 的内部语句,若表达式1为不会执行if 的内部语句,由表达式2进行判定,若表达式2为,则会执行else…if 的的内部语句,如果表达式2也为,则不会执行else…if 的内部语句,会转而去执行后续的其它语句

实践:根据输入的年龄,判断状态。<18打印未成年,>=18并且<=44打印青年,45岁及以上打印中老年
通过 if…else if 的方式来进行不同的条件判断,满足条件时输出对应信息即可

#include<stdio.h>intmain(){intage=0;scanf("%d",&age);if(age<18)//<18岁{printf("未成年");}elseif(age>=18&&age<=44){printf("青年");}else//45岁及以上{printf("中老年");}return0;}

1.4 注意事项

1.4.1 注意事项1

if 后不加大括号时,默认只能跟一条语句,比如:

intmain(){if(0)//0表示假printf("hello");//由于0是假,所以此语句不会执行printf("world");//if 后默认跟一条,所以这条会打印return0;}

在上方例子中,if 的内部语句只有 printf(“hello”) 这一条,不管 if 后的表达式是真实假,printf(“world”);都会执行。如果不想执行,可以加入大括号,比如:

intmain(){if(0)//0表示假{printf("hello");printf("world");}return0;}

在这里,由于if后加了大括号,所以大括号内的所有语句,都是 if 的内部语句,if 后的表达式为假就都不会执行

1.4.2 注意事项2

观看这一段代码,它的结果是?

intmain(){inta=0;intb=1;if(a)if(b)printf("world");elseprintf("error");return0;}

可能会有人觉得是打印error,实际上,什么都不会输出

为什么会这样呢?

因为else 总与最近的 if 进行对齐,所以上面这串代码就可以这样解释:
a为0,b为1,else 与最近的 if 对齐,也就是 if(b),所以相当于 if(b)…else是 if(a) 的内部语句, if (a) 进行判断,结果是假,不会执行内部语句,所以什么都没有输出

更改一下格式后,相当于是这样的代码:

intmain(){inta=0;intb=1;if(a){if(b)printf("world");elseprintf("error");}return0;}

2 switch语句

2.1 switch

switch语句的写法如下:

switch(整形表达式){case(整形常量表达式1):语句[break]case(整形常量表达式2):语句[break]default:语句}

整形表达式:指计算结果为整形的表达式,比如1 + 2, 3 % 2这样的表达式,字符也是可以的,因为字符是以 ASCII 的形式存储的,ASCII 也是整形,但是浮点数不能使用。

整形常量表达式:不可以被修改的值是常量,所以这个表达式指像1,2,3这样的值,字符也可用,浮点数不可用。

switch 语句会根据整形表达式的值,来对 case 中的整形常量表达式进行匹配,如果能找到匹配项,则执行 case 内的语句,找不到并且写了 default 的情况下,会执行 default 语句中的内容

实践:输⼊任意⼀个整数值,计算除3之后的余数
除3后的余数有0,1,2,所以只需要在整形表达式内写上取余的表达式,让 switch 语句根据结果进行 case 的匹配即可

intmain(){intn=0;scanf("%d",&n);switch(n%3)//计算出0,1,2{case0://计算出0,匹配至0printf("余数0");break;case1://计算出1,匹配至1printf("余数1");break;case2://计算出2,匹配至2printf("余数2");break;}return0;}

2.2 注意事项

2.2.1 空格问题

case后必须要有一个空格,否则会有语法错误

2.2.2 break

case 语句中的 break 是用来跳出 switch 语句的,如果没有 break 语句,那么执行时,会一直下滑,直到遇到 break 或者 switch 语句结束,比如:

intmain(){intn=0;scanf("%d",&n);switch(n%3)//计算出0,1,2{case0://计算出0printf("余数0");case1://计算出1printf("余数1");case2://计算出2printf("余数2");break;}return0;}

如果 n % 3 计算出0,会匹配至 case 0,但是由于 case 0 和 case 1没有 break 语句,执行时,会将 case 0,case 1 和 case 2 内的语句按顺序执行

2.2.3 default 语句的位置

default 语句的位置在 switch 中没有特别要求,放在 switch 语句内任何地方都是不影响语法的,但是要保证不能影响代码逻辑

3 条件判断常用运算符

3.1 关系运算符

运算符作用
>判断左侧是否大于右侧
<判断左侧是否小于右侧
>=判断左侧是否大于等于右侧
<=判断左侧是否小于等于右侧
==判断左侧是否等于右侧
!=判断左侧是否不等于右侧

以上的运算符会根据结果会返回0或1,用来表示假和真

3.2 逻辑运算符

3.2.1 &&运算符(逻辑与)

&&运算符的作用是,根据左右两侧的真假情况来得出真假
情况包括:

两侧情况结果
1 && 1两侧都为真,结果是真
1 && 0右侧为假,结果是假
0 && 1左侧为假,结果是假
0 && 0两侧都为假,结果是假

总结一下就是两真则真,一假则假

短路现象:若&&运算符左侧的计算结果是假,则不会去计算右侧的结果,直接得到假,也就是0

3.2.2 ||运算符(逻辑或)

||运算符的作用是,根据左右两侧的真假情况来得出真假
情况包括:

两侧情况结果
1 || 1两侧都为真,结果是真
1 || 0一侧为真,结果是真
0 || 1一侧为真,结果是真
0 || 0两侧都为假,结果是假

总结一下就是一真则真,两假则假

短路现象:若||运算符左侧的计算结果是真,则不会去计算右侧的结果,直接得到真,也就是非0(默认1)

3.2.3 !运算符(取反)

!运算符的作用是,将真转换为假,假转换为真

案例结果
!10
!01

4 while 循环

while 的语法如下:

while(表达式)内部语句

while 会根据表达式的结果来执行内部语句,结果是假,就不执行,结果是真,则执行,执行完毕后会再次进行条件判断结果是假,就循环停止,结果是真,则再执行一次,进行往复来回

实践:打印1-10之间的数字
设置变量 i 作为循环变量,每一次循环让 i 自增1并打印数值,直到 i 大于10,循环停止

intmain(){inti=1;//定义循环变量while(i<=10)//判断{printf("%d ",i);++i;//调整循环变量}return0;}

5 for 循环

while 循环中,循环变量的定义,判断,调整(自增)容易因为代码量的增大导致间隔巨大,不方便查看,所以,设计了 for 循环
for 的语法如下:

for(循环变量初始化;条件判断;变量调整){内部语句;}

运行 for 循环时,先对循环变量进行初始化,再进行条件判断,若为假,则结束循环,若为真,则执行内部语句,执行完内部语句后,进行变量调整,再进行条件判断,若为假,则结束循环,若为真,则执行内部语句,如此往复

实践:打印1-10之间的数字

intmain(){inti=0;for(i=1;i<=10;++i){printf("%d ",i);}return0;}

6 do…while循环

do…while 循环的语法如下:

do{内部语句;}while(表达式);

do…while与其他的循环不同的点是,do…while不管条件如何,总会先执行一次内部语句再进行条件判断,若为假,则结束循环,若为真,则继续执行内部语句,如此往复

实践:打印1-10之间的数字

intmain(){inti=1;do{printf("%d ",i);++i;}while(i<=10);return0;}

7 循环中常用关键字

7.1 break

在 while, for, do…while 中,break 的作用都是一样的,主要作用为结束本层循环并执行后续的代码
例子:

intmain(){inti=1;while(i<=10){if(i==5)break;printf("%d ",i);++i;}return0;}

在这个例子中,当循环变量 i 自增到5时,会出发 if 语句中的break,直接跳出循环,因此只会打印1 2 3 4

7.2 continue

continue在 while,for,do…while 中的主要效果相近,但细节上有微妙的差别
作用主要是跳过当次循环的后续语句

7.2.1 while中的continue

while 循环由于变量调整语句的位置较为随意,所以可能会导致死循环,比如:

intmain(){inti=1;while(i<=10){if(i==5)continue;printf("%d ",i);++i;}return0;}

当 i 循环至 5 时,if 语句的条件判定为真,触发 continue,直接跳过了后续的打印和 ++i 语句,进行条件判断并进入下次循环,但下次循环时,i 仍然是5,依然不会执行 ++i ,如此往复,就变成了死循环

7.2.2 for中的continue

for 循环由于执行完了内部语句才会调整变量,所以一般不会死循环,除非你真的把调整语句写在了 continue 的后面
例子:

intmain(){inti=1;for(i=1;i<=10;++i){if(i==5)continue;printf("%d ",i);}return0;}

当 i 等于5时,执行 if 内的 continue 语句,直接跳过后续的打印语句,执行++i, 此时的 i 会变成6,再次进行判断,因此不会死循环

7.2.3 do…while中的continue

do…while 中的 continue 与 while 中的类似。也会触发死循环,比如:

intmain(){inti=1;do{if(i==5)continue;printf("%d ",i);++i;}while(i<=10)return0;}

原因与while中相同

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/11 12:20:20

Scala Notebook部署教程:本地服务器搭建与远程访问配置终极指南

Scala Notebook部署教程&#xff1a;本地服务器搭建与远程访问配置终极指南 【免费下载链接】scala-notebook Interactive Scala REPL in a browser 项目地址: https://gitcode.com/gh_mirrors/sc/scala-notebook Scala Notebook是一个基于浏览器的交互式Scala REPL工具…

作者头像 李华
网站建设 2026/7/11 12:18:58

Navicat Mac版无限试用重置脚本:简单三步实现永久免费使用

Navicat Mac版无限试用重置脚本&#xff1a;简单三步实现永久免费使用 【免费下载链接】navicat_reset_mac navicat mac版无限重置试用期脚本 Navicat Mac Version Unlimited Trial Reset Script 项目地址: https://gitcode.com/gh_mirrors/na/navicat_reset_mac 核心关…

作者头像 李华
网站建设 2026/7/11 12:17:13

CVE-2022-23366漏洞复现:从SQL注入原理到BurpSuite与SQLMap实战

1. 项目概述与核心目标最近在复现一个经典的Web漏洞&#xff0c;CVE-2022-23366&#xff0c;它影响的是一个名为HMS&#xff08;Hospital Management System&#xff09;的医院管理系统1.0版本。这个漏洞的本质是一个登录接口的SQL注入&#xff0c;利用起来非常直接&#xff0c…

作者头像 李华
网站建设 2026/7/11 12:16:25

Playnite游戏库管理器架构深度解析:统一游戏管理的技术实现

Playnite游戏库管理器架构深度解析&#xff1a;统一游戏管理的技术实现 【免费下载链接】Playnite Video game library manager with support for wide range of 3rd party libraries and game emulation support, providing one unified interface for your games. 项目地址…

作者头像 李华
网站建设 2026/7/11 12:15:26

3 种主流语法分析算法对比:LL(1)、LR(1) 与算符优先分析实战解析

3 种主流语法分析算法对比&#xff1a;LL(1)、LR(1) 与算符优先分析实战解析在构建编译器或解释器的过程中&#xff0c;语法分析器扮演着至关重要的角色。它负责将词法分析器生成的标记流转换为抽象语法树&#xff08;AST&#xff09;&#xff0c;为后续的语义分析和代码生成奠…

作者头像 李华