【C生万物】C语言分支和循环语句

C语言

📚博客主页:爱敲代码的小杨.

✨专栏:《Java SE语法》 | 《数据结构与算法》 | 《C生万物》

❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️

🙏小杨水平有限,欢迎各位大佬指点,相互学习进步!

文章目录

  • 1、if语句
    • 1.1 if语句的语法格式:
    • 1.2 if语句的执行流程
    • 1.3 if ...else 语句
    • 1.4 级联式if语句
    • 1.5 “悬空else” 的问题
  • 2、switch语句
  • 3、while循环
    • 3.1 while语句的格式
    • 3.2 while语句的执行流程
    • 3.3 while语句的实践
  • 4、for循环
    • 4.1 for语句的格式
    • 4.2 for语句的执行流程
    • 4.3 for语句的实践
    • 4.4 for语句和while语句的对比
  • 5、do...while循环
    • 5.1 do...while语句的格式
    • 5.2 do...while语句的执行流程
    • 5.3 do...while语句的实践
  • 6、break和continue
  • 7、goto语句

1、if语句

if 语句允许程序通过测试表达式的值从两种选项中选择一种。

1.1 if语句的语法格式:

if(表达式)语句

表达式成立(为真),则语句执行,表达式不成立(为假),则语句不执行。
在C语言中,0表示假,非0表示真。也就是表达式的结果如果是0,则语句不执行,表达式的结果如果不是0,则语句执行

1.2 if语句的执行流程

image.png

1.3 if …else 语句

语法格式:

if(表达式)语句;
else语句;

1.4 级联式if语句

编程时常常需要判断一系列的条件,一旦其中某一个条件为真就立刻停止。“级联式”if语句常常时编写这类系列判定的最好方法。
例如:下面这个级联式if语句用来判定n是小于0、等于0、大于0

if(n<0)printf("%d小于0\n",n);
elseif(n==0)printf("%d等于0\n",n);elseprintf("%d大于0\n",n);

虽然第二个 if 语句式嵌套在第一个if语句内部的。通常不会对他对进行缩进,而是把每个else都与最初的 if 对齐:

if(n<0)printf("%d小于0\n",n);
else if(n==0)printf("%d等于0\n",n);
elseprintf("%d大于0\n",n);

级联式 if 语句独特的书写形式:

if(表达式)语句
else if(表达式)语句
else if(表达式)语句
...
else语句

1.5 “悬空else” 的问题

当 if 语句嵌套时,千万要当心著名的“悬空else”的问题。
思考下面这个例子:

#include <stdio.h>int main()
{int a = 0;int b = 2;if(a == 1)if(b == 2)printf("hehe\n");elseprintf("haha\n");return 0;
}

程序运行结果是什么呢?
很多人认为 a = 0,不等于1,程序执行else子句,打印haha,但是你运行程序的时候,输出结果:什么都没有打印。
image.png
这就是悬空else的问题,如果有多个 ifelse 的时候,else 总是跟最近的未配对的 if 匹配。
如果代码改成下面这样更容易理解了

#include <stdio.h>int main()
{int a = 0;int b = 2;if (a == 1){if (b == 2)printf("hehe\n");elseprintf("haha\n");}return 0;
}

或者如果我们希望else确定和第一个if匹配,可以把代码改成这样。

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

只要带上适当的大括号,代码的逻辑就会更加清晰,所以大家以后子啊写代码的时候要注意括号的使用,让代码的可读性更高。

注:if 和 else 语句默认都只控制一条语句,想要控制多条语句需要加上{},构成复合语句。

2、switch语句

除了 if 语句外,C语言还提供了 switch 语句来实现分支结构
switch 语句是一种特殊形式的 if...else 结构,用于判断条件有多个结果的情况。它把多重的 else if 改成更易用、可读性更好的形式。
switch 的语法格式:

switch(表达式)
{case 常量表达式:语句case 常量表达式:语句   ...case 常量表达式:语句  default :语句
}

switch 的组成部分:

  • 控制表达式switch 后面必须跟着圆括号括起来的整形表达式。C语言把字符当成整数来处理,因此在 switch 语句中可以对字符进行判定。但是,这不适用于浮点数和字符串。
  • 分支标号:每个分支的开头都有一个标号,格式如下:

case 常量表达式:

常量表达式很像普通的表达式,只是不能包含变量和函数调用。因此,5是常量表达式,5 + 10 也是常量表达式,但 n + 10 不是常量表达式(除非n是表示常量的宏)。分支标号中常量表达式的值必须是整数(字符也可以)

  • 语句:每个分支标号的后边可以任意数量的语句,并且不需要用花括号把这些语句括起来。每组语句的最后一条通常是break 语句。

C语言不允许有重复的分支标号,但对分支的顺序没有要求,特别是 default 分支不一定要放置在最后。
default 的作用:
switch 语句不要求一定有 default 分支。如果 default 不存在,而且控制表达式的值和任何一个分支标号都不匹配的话,控制会直接传给 switch 语句后面的语句。

3、while循环

循环是重复执行其他语句(循环体)的一种语句。

3.1 while语句的格式

while(表达式)语句

3.2 while语句的执行流程

image.png
首先执行判断表达式,表达式的值为0,循环直接结束;表达式的值不为0,则执行循环语句,语句执行完后再继续判断,是否进行下一次判断。

3.3 while语句的实践

练习:在屏幕上打印1~10的值
代码:

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

运行结果:
image.png

4、for循环

4.1 for语句的格式

for(声明或者表达式1;表达式2;表达式3)语句

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

4.2 for语句的执行流程

image.png
首先执行表达式1初始化循环变量,接下来就是执行表达式2的判断部分,表达式2的结果如果==0,则循环结束;表达式2的结果如果!=0则执行训话语句,循环语句执行完后,再去执行表达式3,调整循环变量,然后再去表达式2的地方执行判断,表达式2的结果是否为0,决定循环是否继续。
整个循环的过程中,表达式1初始化部分只被执行1次,剩下的就是表达式2、循环语句、表达式3在循环

4.3 for语句的实践

练习:在屏幕上打印1~10的值
代码:

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

运行结果:
image.png

4.4 for语句和while语句的对比

image.png

5、do…while循环

5.1 do…while语句的格式

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

whilefor 这两种循环都是先判断,条件如果满足就进入循环,执行循环语句,如果不满足就跳出循环;
do...while 循环则是先直接进入循环体,执行循环鱼护,然后在执行 while 后的判断表达式,表达式为真,就会进行下一次,表达式为假,则不再继续循环。

5.2 do…while语句的执行流程

do...while语句执行流程.drawio.png
do...while 循环中先执行图上的“语句”,执行完语句,在去执行“判断表达式”,在判断表达式的结果是!=0,则继续循环,执行循环;判断表达式的结果==0,则循环结束。
所以在do...while 语句中循环体是至少执行一次的,这是do...while 循环比较特殊的地方。

5.3 do…while语句的实践

练习:在屏幕上打印1~10的值
代码:

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

运行结果:
image.png

6、break和continue

在循环执行的过程中,如果某些状况发生的时候,需要提前终止循环。

  • break 的作用是用于永久的终止循环,只要break 被执行,直接就会跳出循环,继续往后执行。
  • continue 的作用是跳出本次循环 continue 后边的代码

7、goto语句

C语言提供了一种非常特别的语法,就是goto 语句和跳转标号,goto 语句可以实现在同一个函数内跳转到设置好的标号处。
标号只是放置在语句开始处的标识符:

标识符:  语句

goto语句格式

goto 标识符;

例如:

#include<stdio.h>int main()
{printf("hehe\n");goto next;printf("haha\n");next:printf("跳过haha的打印\n");return 0;
}

运行结果:
image.png
goto 语句如果使用的不当,就会导致在函数内部随意乱跳转,打乱程序的执行流程,所以能不用尽量不去使用;但是goto 语句也不是一无是处,在多层循环的代码中,如果想快速跳出使用goto 就非常的方便了。

for(...)
{for(...){for(...){if(1)goto next;}}
}next://...

本来for 循环也使用break 跳出,但是break 只能跳出一次循环,这里就要用3个break 才可以跳出循环,所以这种情况使用goto语句就更快捷。

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

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

相关文章

最好的方式来预测未来是去创造它。

在辅导企业的过程中&#xff0c;对于「建设性的冲突」持开放态度&#xff0c;这背后反映了一种深刻的系统思考和变革管理的理念。在许多传统工作环境中&#xff0c;「和谐」往往被高度重视&#xff0c;但这种表面的和谐有时会掩盖问题的真相&#xff0c;阻碍组织的深层次变革和…

顺序表、链表相关OJ题(2)

创作不易&#xff0c;友友们给个三连吧&#xff01;&#xff01; 一、旋转数组&#xff08;力扣&#xff09; 经典算法OJ题&#xff1a;旋转数组 思路1&#xff1a;每次挪动1位&#xff0c;右旋k次 时间复杂度&#xff1a;o(N^2) 右旋最好情况&#xff1a;k是n的倍数…

【力扣】快乐数,哈希集合+快慢指针+数学

快乐数原题地址 方法一&#xff1a;哈希集合 定义函数getNext(n)&#xff0c;返回n的所有位的平方和。一直执行ngetNext(n)&#xff0c;最终只有2种可能&#xff1a; n停留在1。无限循环且不为1。 证明&#xff1a;情况1是存在的&#xff0c;如力扣的示例一&#xff1a; 接…

P1808 单词分类

P1808 单词分类 题目描述 Oliver 为了学好英语决定苦背单词&#xff0c;但很快他发现要直接记住杂乱无章的单词非常困难&#xff0c;他决定对单词进行分类。 两个单词可以分为一类当且仅当组成这两个单词的各个字母的数量均相等。 例如 AABAC&#xff0c;它和 CBAAA 就可以…

DAY14之二叉树理论基础及递归遍历和迭代遍历

理论基础 满二叉树 满二叉树&#xff1a;如果一棵二叉树只有度为0的结点和度为2的结点&#xff0c;并且度为0的结点在同一层上&#xff0c;则这棵二叉树为满二叉树。 如图所示&#xff1a; 这棵二叉树为满二叉树&#xff0c;也可以说深度为k&#xff0c;有2^k-1个节点的二叉…

2024年微信公众号链接爬取

通过输入&#xff08;或文件导入&#xff09;公众号名称&#xff0c;即可爬取该公众号所有历史文章。 通过公众号官方网站调用API&#xff0c;打开开发者工具后发现有 打开后发现有搜索结果的fakeid&#xff0c;这是每个公众号的标识。 点击某公众号后出现 这是具体公众号文章…

Linux【docker 设置阿里源】

文章目录 一、查看本地docker的镜像配置二、配置阿里镜像三、检查配置 一、查看本地docker的镜像配置 docker info一般没有配置过是不会出现Registry字段的 二、配置阿里镜像 直接执行下面代码即可&#xff0c;安装1.10.0以上版本的Docker客户端都会有/etc/docker 1.建立配置…

Vue3.4+element-plus2.5 + Vite 搭建教程整理

一、 Vue3Vite 项目搭建 说明&#xff1a; Vue3 最新版本已经基于Vite构建&#xff0c;关于Vite简介&#xff1a;Vite 下一代的前端工具链&#xff0c;前端开发与构建工具-CSDN博客 1.安装 并 创建Vue3 应用 npm create vuelatest 创建过程可以一路 NO 目前推荐使用 Vue R…

Java+微信小程序实现智慧家政系统 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示四、核心代码4.1 查询家政服务4.2 新增单条服务订单4.3 新增留言反馈4.4 小程序登录4.5 小程序数据展示 五、免责说明 一、摘要 1.1 项目介绍 基于微信小程序JAVAVueSpringBootMySQL的智慧家政系统&#xff0…

阿里云游戏服务器多少钱一个月?

阿里云游戏服务器租用价格表&#xff1a;4核16G服务器26元1个月、146元半年&#xff0c;游戏专业服务器8核32G配置90元一个月、271元3个月&#xff0c;阿里云服务器网aliyunfuwuqi.com分享阿里云游戏专用服务器详细配置和精准报价&#xff1a; 阿里云游戏服务器租用价格表 阿…

2024图像消除相关论文大集合

28篇图像填充/Inpainting相关论文 1 CR-Fill: Generative Image Inpainting with Auxiliary Contextual Reconstruction ICCV2021 吐槽DeepFillv2 with CA layer&#xff0c;由于缺乏对缺失区域与已知区域之间对应关系的监督信号&#xff0c;可能无法找到合适的参考特征&…

LeetCode130:被围绕的区域(图的简化版之网格结构上的DFS)

题目 注意&#xff1a; 1 < m, n < 200 board[i][j] 为 ‘X’ 或 ‘O’ 思路 根据一般网格结构上的DFS&#xff0c;或者说岛屿问题&#xff0c;第一反应很容易想到找出所有的‘O’然后开始DFS遍历&#xff0c;改为‘X’。 但是这里有个联通的问题&#xff0c;如果这个…