C语言笔记3:输入输出与分支循环
在C语言的学习中流程控制是构建程序逻辑的核心它决定了程序的执行顺序和执行逻辑也是从基础语法过渡到实际程序开发的关键环节。本次总结围绕C语言流程控制展开涵盖数据的输入与输出、分支结构、循环结构三大核心模块梳理了printf/scanf格式化输入输出的细节、分支结构的多种实现方式、循环结构的使用技巧及典型案例同时整理了各类语法的注意事项和实际开发中的避坑点适合C语言初学者巩固基础也可作为日常开发的速查笔记。一、数据的输入与输出输入输出是程序与用户交互的基础C语言中通过标准库函数printf输出和scanf输入实现核心是格式化符的正确使用和输入输出的格式控制需引入头文件#include stdio.h。1. 格式化输出printf语法printf(格式化控制字符串, 输出列表);格式化控制字符串由格式说明符%特定字符和普通字符原样输出组成输出列表可包含常量、变量、表达式个数需与格式说明符一一对应。常用格式说明符涵盖整型、字符型、字符串型、浮点型、指针型等是printf的核心需匹配数据类型格式符对应类型功能说明%d/%uint/unsigned int十进制有符号/无符号整数%cchar单个字符%schar[]字符串以\0结尾%f/%lffloat/double小数形式浮点型%f兼容float/double%lf仅double%e/%Efloat/double指数形式浮点型%ld/%lldlong/long long长整型/长长整型%x/%#xint/unsigned int十六进制输出%#x带0x前缀%o/%#oint/unsigned int八进制输出%#o带0前缀%p指针类型输出内存地址十六进制带0x前缀%%-输出百分号%本身输出格式精细化控制可指定宽度、对齐方式、保留小数位数等实现格式化输出的定制化整型%[标志]m类型如%6d右对齐宽度6、%-6d左对齐、%06d0填充、%6d强制显示正负号字符串%[标志]m.ns如%7.2s宽度7截取前2个字符、%-5.3s左对齐宽度5截取前3个字符浮点型%[标志]m.nf/%m.ne如%8.2f宽度8保留2位小数四舍五入、%9.2e指数形式保留2位尾数自动适配%g/%G自动选择%f或%e中更简洁的格式去除无意义的末尾0和小数点。2. 格式化输入scanf语法scanf(格式化控制字符串, 地址列表);核心作用将键盘输入的数据存入地址列表指定的内存单元地址列表必须是内存地址普通变量加取地址字符串数组直接用数组名。核心注意事项格式说明符需与输入数据类型、地址列表顺序一一对应浮点型输入需严格区分%f对应float%lf对应double若格式化控制字符串包含普通字符如,、-、文字输入时需在对应位置输入相同字符%c会读取输入缓冲区的空白字符空格、Tab、\n需在%c前加空格跳过如%c %c %c可指定输入宽度如%3d截取前3位或用%*d跳过指定列数的输入实型输入不能用m.n的形式如%7.2f是错误用法。输入缓冲区机制程序启动时开辟输入缓冲区执行scanf时先检查缓冲区有数据则直接读取无数据则等待用户输入需注意缓冲区残留的空白字符对后续输入的影响。3. 常见错误格式说明符与数据类型不匹配会导致输出/输入异常如用%d输出double类型会得到随机值需严格保证类型一致必要时使用强制类型转换。二、分支结构分支结构根据条件表达式的真假C语言中非0为真0为假决定程序的执行路径分为单分支、双分支、多分支核心是条件表达式的构建和分支语句的嵌套使用。1. 条件表达式基础分支的判断依赖关系表达式和逻辑表达式二者结果均为逻辑值1为真0为假。关系运算符6种、、、、、!优先级低于算数运算符高于逻辑运算符。逻辑运算符3种逻辑与两边均为真则真左假则右短路||逻辑或两边均为假则假左真则右短路!逻辑非单目运算符真变假假变真。优先级! 算数运算符 关系运算符 || 赋值运算符。2. if语句实现分支单分支if语法if (条件表达式) { 语句块; }条件为真则执行语句块为假则跳过单语句可省略{}但建议始终添加提升代码可读性。双分支if…else…语法if (条件表达式) { 语句1; } else { 语句2; }条件为真执行语句1为假执行语句2二者必选其一else必须与最近的未配对if匹配可通过{}强制指定配对关系。多分支if…else if…else…语法if (表达式1) { 语句1; } else if (表达式2) { 语句2; } ... else { 语句n; }条件判断顺序执行找到第一个真条件后执行对应语句后续不再判断else为可选部分无匹配条件时执行。if语句嵌套if语句内部包含另一个完整的if/if…else即为嵌套结构嵌套层级建议≤3~4层避免代码可读性差需注意else的配对规则必要时用{}明确作用域。3. 三目运算符简化双分支语法表达式1 ? 表达式2 : 表达式3;本质是单语句双分支if的简写仅适用于单语句场景表达式1为真执行表达式2并返回其值为假则执行表达式3并返回其值优先级高于赋值运算符低于逻辑运算符。4. switch语句实现多分支专门用于条件为离散值整型、字符型的多分支场景比if多分支更简洁语法switch(表达式){case常量表达式1:语句1;break;case常量表达式2:语句2;break;...default:语句n;break;}核心规则表达式结果必须是整型/字符型不能是浮点型或字符串case后的常量表达式值必须唯一否则编译报错break用于跳出switch无break会触发穿透效应执行完当前case后继续执行后续case多个case可共用一组语句无需重复编写default为可选部分无匹配case时执行建议写在所有case最后。适用场景当判断条件为固定值的等值判断时如成绩等级、月份判断季节、简易计算器优先使用switch若为范围判断则适合用if多分支。三、循环结构循环结构实现代码的重复执行分为有限循环指定循环次数/终止条件和无限循环死循环谨慎使用C语言中主要通过while、for实现当型循环先判断后执行核心是循环三要素循环变量初始化、循环条件、循环变量更新三者需形成闭环否则会导致死循环。1. while循环语法// 循环变量初始化while(循环条件){// 条件为真执行循环体循环体语句;循环变量更新;// 向循环出口逼近}特点先判断后执行循环体可能一次都不执行单语句可省略{}循环条件为1时为死循环while(1)适用场景循环次数不确定的场景仅知道循环终止条件。典型案例累加和/累乘积计算1~100累加和、偶数和水仙花数判断拆分数字的各位计算n次幂之和清空输入缓冲区while(getchar() ! \n);。2. for循环for循环是while循环的特殊写法结构更清晰适合循环次数确定的场景语法for(循环变量初始化;循环条件;循环变量更新){循环体语句;}核心规则()内的三个部分均可省略但若省略循环条件即为死循环for(;;)循环变量可初始化多个用逗号分隔更新也可多个用逗号分隔执行顺序初始化 → 判断条件 → 执行循环体 → 更新变量 → 再次判断条件直至条件为假。典型案例阶乘计算n! 1×2×…×n斐波拉契数列生成前两个数为1后续每个数为前两个数之和固定次数的遍历、统计如统计10个整数中的正数个数。3. 循环的核心注意事项循环变量的初始化需在循环外while或for的初始化部分避免每次循环重新初始化循环变量的更新必须存在且能逐步让循环条件变为假否则会陷入死循环浮点型数据因精度问题不宜作为循环条件的判断依据如while(f 0.1)循环体中可通过break跳出循环、continue跳过本次循环进入下一次控制循环执行后续拓展知识点。4. 典型循环案例水仙花数/四叶玫瑰数查找拆分数字各位计算n次幂之和累加/累乘运算含条件的累加如奇数和、指定规律的数列和数列生成斐波拉契数列、等差数列/等比数列数据统计如统计输入数据的最大值、平均值。四、核心避坑点与编程规范格式符匹配printf中%f兼容float/doublescanf中%f仅对应float、%lf仅对应double严格匹配避免数据错误scanf地址普通变量必须加取地址字符串数组直接用数组名避免编译错误else配对if/else嵌套时用{}明确作用域避免else匹配错误switch穿透除多case共用语句外每个case末尾必须加break避免逻辑错误循环三要素确保循环变量初始化、条件、更新形成闭环杜绝死循环变量初始化局部变量未初始化会为随机值使用前必须赋值全局变量/静态变量默认初始化为0代码可读性分支/循环的单语句也建议添加{}嵌套层级不宜过深合理添加注释。五、总结流程控制是C语言程序的“骨架”输入输出是程序与用户交互的基础核心在于格式化符的灵活使用和输入输出的细节把控分支结构实现了程序的“选择逻辑”if语句适合范围判断switch语句适合离散值的等值判断三目运算符简化单语句双分支循环结构实现了程序的“重复逻辑”while适合循环次数不确定的场景for适合循环次数确定的场景二者的核心都是循环三要素的闭环。掌握流程控制的关键在于理解语法规则多做实际案例从简单的累加、判断开始逐步实现复杂的程序逻辑如简易计算器、阶梯电价计算、百钱买百鸡等在实践中熟悉避坑点形成良好的编程习惯为后续的数组、函数、指针等高级知识点打下坚实基础。