当前位置: 首页 > news >正文

C语言学习笔记4

一、综述

今天真正的系统性的学完了循环,包括for、while、do...while,以及相关的语句比如break、continue、goto,还学习了随机数相关的关键词,接下来是详细的讲解。

二、循环

1、循环语句

纠正一下之前的错误,循环语句是for、while、do...while,switch并不是循环函数

for循环是C语言中最常用的循环,主体结构为for(表达式1;表达式2;表达式3)

其中表达式1用于初始化变量,表达式2用来描述表达式,表达式3则用于操作函数,使其发生变化。

#include<stdio.h> int main() { int a = 0; // 初始化a;a<10则继续循环;a自增1 for(a = 0 ; a < 10 ; a++) { printf("%d\n" , a ); } return 0 ; }

这段代码会一直循环打印a,代码的输出结果为

1

2

3

4

5

6

7

8

9

因为for循环的判断逻辑为a++以后判断a<10,所以a=9再加一后变为a=10,所以跳过后面的打印语句,最终结果就是10无法打印,所以for循环的执行次数为n-1.

while语句和for语句的区别在于while语句的初始化和自增位置不同。

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

这段代码也是循环打印1-10,结果为:

1

2

3

4

5

6

7

8

9

10

因为while语句的判断条件是开始的时候判断,所以a=9的时候并没有超过10还会运行一次,然后a++再打印,所以就可以打印出10,所以while语句的循环次数为n,while语句和for语句比起来最大的问题在于for将变量的初始化及操作变量集成在开头,而while本身只有表达式,这可能导致while循环容易出现死循环,例如忘记给变量增加变化,就会导致变量一直不变从而造成死循环。

do...while语句是while语句的一种变种写法为

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

打印结果与上面的while循环的结果一致,但是有一点需要注意,while语句是先判断再开始循环,所以可能完全不循环,do...while会先执行一次代码再进行判断。

2、循环关键词

循环中常用的关键词为continue、break、goto

continue用于重新开始新一轮循环,break用于跳出循环,goto则是跳转至某个特定的位置

#include<stdio.h> int main() { int a = 0; this: while (a < 10) { a++; if (4 == a) { continue; } if (7 == a) { break; } printf("%d ", a); } if (a<10) { goto this; } return 0; }

遮断代码的运行结果为1 2 3 5 6 8 9 10

因为a == 4的时候使用了continue语句跳过了后面的代码,重新开始,所以没有打印4,7 == a的时候直接跳出了循环,所以没有打印7,又因为使用了goto,跳转到了this的位置,所以重新开始了一遍循环,但是a没有初始化,所以a是从7开始循环,然后a++后a=8就不再触发continue、break、goto,所以代码运行结束。

三、随机数

C语言中的随机数关键词是rand,取值范围为0~32767,rand是一个伪随机数

直接用rand输出的话最多5次为一个循环,循环会是以下的数字循环

41 18467 6334 26500 19169

因为rand默认种子是1,所以如果没有对种子进行初始化,就会无法生成真随机数,这时可以使用时间戳来对rand进行随机化

#include <stdio.h> #include <stdlib.h> #include <time.h> int main() { srand((unsigned)time(NULL)); for (int i = 0; i < 5; i++) { printf("%d ", rand()); } return 0; }

这段代码就是利用时间戳对rand的种子进行随机取值,srand表示设置随机数种子,time表示时间戳,NULL则表示不用时间戳的数据,这样time(NULL)的数字就会赋给srand,又因为srand需要int 类型的数据,但是time生成的是无符号的数据,所以使用unsigned强制将time赋给srand。

http://www.jsqmd.com/news/643483/

相关文章:

  • 深度学习核心架构全解析
  • LangChain、LangGraph入门
  • openclaw config set agents.defaults.llm.idleTimeoutSeconds 0
  • 2026年靠谱的雕印兔毛绒/兔毛绒/小兔毛绒/玉兔毛绒实力工厂推荐 - 行业平台推荐
  • 从“普惠”到“全能”:全志T153工业芯如何以HZ-T153_MiniEVM重塑工控开发体验
  • 【无标题】健身这件事,说起来容易,吃起来难
  • 【稀缺首发】SITS2026圆桌闭门纪要:全球仅12家机构获准验证的多模态推理新范式(含3项未公开Benchmark数据)
  • 【实战派×学院派】88|领导要求“创新”,但没人敢试错?
  • 【零日对抗样本防御白皮书】:基于动态梯度掩蔽+可信执行环境(TEE)的AIAgent双模防护架构(附GitHub开源验证代码)
  • 【性能调优】NCCL环境变量实战:多机训练中的关键配置解析
  • OpenScanner: 开源AI 驱动的混合安全扫描引擎,带你告别误报地狱!
  • RT-DETR实战入门:从零搭建PyTorch训练环境与数据准备
  • 立知-lychee-rerank-mm详细步骤:日志排查、重启、调试全流程
  • 【CVPR26-马连博-东北大学】面向增量式统一多模态异常检测:基于信息瓶颈视角增强多模态去噪
  • 后端接收并解析合约回执信息【FISCOBCOS】
  • 第四讲:曲面 Pattern 缺陷检测的核心几何机制——两层配准与注册集、测量集的角色分工
  • org.openpnp.vision.pipeline.stages.DetectLinesHough
  • 谁在定义企业级Agent标准?一次硬核测评给出了答案
  • 财务法务福音!Qwen3-VL-30B智能合同字段提取保姆级教程
  • AI人体骨骼关键点检测作品集:多场景骨架图生成,效果直观一目了然
  • 像素史诗效果展示:研报生成过程中的‘能量值’反馈与推理稳定性监测
  • 4月15日成都地区振鸿产焊管(Q235B;内径DN15-200mm)现货报价 - 四川盛世钢联营销中心
  • 移动端架构演进
  • MySQL8.0升级到MySQL8.4避坑:密码插件问题
  • Qwen2.5-VL-7B-Instruct快速上手:网页截图→响应式HTML→CSS样式生成
  • Pixel Epic智识终端入门教程:动态卷轴流式输出与中断续写功能详解
  • 忍者像素绘卷:天界画坊Proteus仿真联动:为电子设计添加像素艺术界面
  • UiPath003 创建基本库
  • Ubuntu 20.04下快速配置Fcitx框架与谷歌拼音输入法
  • 2026年行业内二次元投影仪生产公司,影像测量仪/2.5次元测量仪/二次元检测仪/三次元测量仪,二次元投影仪研发哪个好 - 品牌推荐师