C语言Ⅲ:条件判断与分支结构(从if到switch)
条件判断基础什么是条件判断C语言中的条件判断根据某个条件的成立与否决定是否执行指定的代码。类比条件判断就像十字路口的红路灯——红灯条件为真→停下执行某一分支绿灯条件为假→通行执行另一分支条件判断的定义根据某个条件的成立与否决定是否执行指定的操作。条件判断的结果为逻辑值真非0值C语言中为了统一管理一般用1表示真。假0值面试题① C语言中条件表达式作为分支或者循环条件的表达式支持任意类型的表达式包括关系、逻辑、赋值、算数等但仅关系表达式和逻辑表达式能表达有意义的条件判断。② 关系运算符和逻辑运算符的表达式结果值为int类型的1真或0假但在布尔上下文如if(x)中任意非零值均被视为真。关系与逻辑运算符六种关系运算符(高优先级) !(低优先级)三种逻辑运算符!逻辑非逻辑与||逻辑或真值表ab!aaba||b非0非0011非000010非010100100逻辑运算符短路特性短路特性是逻辑运算符的重要优化机制对条件判断的执行有直接影响逻辑与左侧操作数为假时右侧操作数不执行结果直接为假逻辑或||左侧操作数为真时右侧操作数不执行结果直接为真案例设a4b5表达式结果说明!a0a4(非0为真)逻辑非后为假a b1两侧均为非0结果为真a || b1左侧操作数为真触发短路直接返回真!a || b1左假由真结果为真4 0 || 214 0为00 || 2为1小贴士逻辑运算符的操作数可为任意类型字符型、实型、指针型等系统均以 0 和非 0 判定真假。例如c d结果为 1字符的 ASCII 码均为非 0。// (x y) (x - y) 等价于 x y x - y用if语句实现分支结构单分支if..语法// 复合语句多条语句需要{}包裹 if(条件表达式) { // 语句块分支体也就是{}包裹的整体内容 } ​ // 但语句可省略{}以下两种写法完全等价 if(条件表达式)语句 if(条件表达式) 语句 ​ // 该语句属于流程控制语句中的分支语句是极少数无需分号;结尾的语句功能条件表达式返回的结果是逻辑值如果为真非0执行后续语句块再执行if语句后的其他代码条件表达式为假0跳过后续语句块直接执行if语句后的其他代码案例计算一个分段函数需求计算并输出下列分段函数的值$$y \begin{cases} -2 \quad x0\\ \\ 2 \quad\quad x\geq0 \end{cases}$$pre#include stdio.h ​ int main(int argc,char *argv[]) { int x, y -2; // 创建两个变量初始化y为x0的值 printf(请输入一个整数); scanf(%d,x); ​ // 判断条件满足时修改y的值 if(x 0) y 2; ​ printf(x%d,y%d\n, x, y); ​ return 0; }运行结果n-vm:/mnt/hgfs/code/20260803$ ./a.out 请输入一个整数-3 x-3,y-2 n-vm:/mnt/hgfs/code/20260803$ ./a.out 请输入一个整数6 x6,y2双分支if..else..语法// 复合语句需要{}包裹 if (条件表达式) { 语句1; // 条件为真时执行 } else { 语句2; //条件为假时执行 } ​ // 但语句可省略{}以下两种写法完全等价 if (条件表达式) 语句1; else 语句2; ​ if (条件表达式) 语句1; else 语句2;核心规则else不能单独存在不许与最近的未配对的if配对t条件无论真假必须且仅执行语句1或语句2中的一个功能说明if..else实现双分支选择支持嵌套建议嵌套层级3~4层保证代码可读性和可维护性语句1和语句2均可为单语句或复合语句案例计算分段函数需求计算并输出下列分段函数的值$$y \begin{cases} -2 \quad x0\\ \\ 2 \quad\quad x\geq0 \end{cases}$$代码#include stdio.h ​ int main(int argc,char *argv[]) { // 定义两个变量x, y, x用来接收控制台的输入 int x, y; ​ printf(请输入一个整数); scanf(%d, x); ​ // 校验 if (x0) y -2; else y 2; ​ printf(x %d, y %d\n, x, y); ​ return 0; }运行结果请输入一个整数-3 x -3, y -2 请输入一个整数6 x 6, y 2案例判断闰年和平年需求输入一个年份判断其为闰年还是平年规则year % 4 0 year %100 !0 || year % 400 0#include stdio.h ​ int main(int argc,char *argv[]) { // 定义一个变量用来存储年份 int year; ​ printf(请输入一个年份(yyyy)\n); scanf(%d, year); ​ // 闰年校验 if (year %4 0 year % 100 ! 0 || year % 400 0) printf(%d是闰年!\n,year); else printf(%d是平年!\n,year); ​ return 0; }运行结果请输入一个年份(yyyy) 2023 2023是平年!多分支if..else if..[else..]语法// 写法1嵌套的if..else..不推荐 if (表达式1) 语句1; else if (表达式2) 语句2; ... else if (表达式n) 语句n; else 语句n1; // 写法2并列if..else if..else..推荐 if (表达式1) 语句1; else if (表达式2) 语句2; ... else if (表达式n) 语句n; // 可选 else 语句n1; // 可选无匹配条件时执行 ​ // 注意复合语句必须用{}包裹起来单语句可省略核心规则else为可选部分根据需求决定是否添加同一时刻仅能满足一个分支条件判断顺序执行找到第一个真条件后执行对应语句后续不再判断案例成绩评定需求根据学生成绩0~100评级成绩 90 → A级成绩 80 → B级成绩 60 → C级成绩 60 → D级代码#include stdio.h ​ /** * biref 方式1依赖条件判断的顺序执行顺序不可打乱代码比较简洁结构清晰 */ void if_test1() { // 创建一个变量用来存储成绩 int score; printf(请输入一个整数0~100); scanf(%d, score); ​ // 非法校验 if (score 0 || score 100) { printf(请输入0~100之间的整数\n); return; } ​ // 评级 if (score 90) printf(A级\n); else if (score 80) printf(B级\n); else if (score 60) printf(C级\n); else printf(D级\n); } ​ /** * biref 方式2不依赖条件判断的顺序执行顺序可打乱代码比较苛刻结构复杂 */ void if_test2() { // 创建一个变量用来存储成绩 int score; printf(请输入一个整数0~100); scanf(%d, score); ​ // 非法校验 if (score 0 || score 100) { printf(请输入0~100之间的整数\n); return; // 提前结束函数后续代码不再执行 } ​ // 评级 if (score 60 score 80) printf(C级\n); else if (score 80 score 90) printf(B级\n); else if (score 90) printf(A级\n); else printf(D级\n); ​ // 一个表达式中既有逻辑运算符又有关系运算符这个表达式就被称作复合表达式 } int main(int argc,char *argv[]) { if_test1(); if_test2(); ​ return 0; }运行结果yueqianyueqian-vm:/mnt/hgfs/code/20260804$ ./a.out 请输入一个整数0~10085 B级 yueqianyueqian-vm:/mnt/hgfs/code/20260804$ ./a.out 请输入一个整数0~10034 D级 yueqianyueqian-vm:/mnt/hgfs/code/20260804$ ./a.out 请输入一个整数0~10065 C级方式1 vs 方式2方式1推荐依赖条件判断的顺序性从大到小代码简洁但执行顺序不可打乱方式2不依赖顺序性使用范围判断执行顺序可任意交换但代码较长逻辑更严格if..else 结构注意点语句1和语句2均可为复合语句需要用{}包裹或空语句例if(..);else;正确但无意义空语句仅占语法位置不执行任何操作。面试题char c A; printf(%ld\n, sizeof(c)); // 1,指定了c的类型char printf(%ld\n, sizeof(char)); // 1,1char1字节 printf(%ld\n, sizeof(A)); // 4,未明确类型默认按ASCII码int计算if 语句的嵌套语法if (表达式1) if(表达式2) 语句1; // 表达式12均为真时执行 else 语句2; // 表达式1为真表达式2为假时执行 else if(表达式3) 语句3; // 表达式1为假表达式3为真时执行 else 语句4; // 表达式13为假时执行核心规则①else始终与前面最近的未配对 if配对默认规则② 可通过添加{}强制指定配对关系避免歧义③ 只要 if 语句内部包含另一个完整的 if 或if..else即属于嵌套结构#include stdio.h ​ /** * biref 方式1依赖条件判断的顺序执行顺序不可打乱代码比较简洁结构清晰 */ void if_test1() { // 创建一个变量用来存储成绩 int score; printf(请输入一个整数0~100); scanf(%d, score); ​ // 非法校验 if (score 0 || score 100) { printf(请输入0~100之间的整数\n); return; } ​ // 评级 if (score 90) printf(A级\n); else if (score 80) printf(B级\n); else if (score 60) printf(C级\n); else printf(D级\n); } ​ /** * biref 方式2不依赖条件判断的顺序执行顺序可打乱代码比较苛刻结构复杂 */ void if_test2() { // 创建一个变量用来存储成绩 int score; printf(请输入一个整数0~100); scanf(%d, score); ​ // 非法校验 if (score 0 || score 100) { printf(请输入0~100之间的整数\n); return; // 提前结束函数后续代码不再执行 } ​ // 评级 if (score 60 score 80) printf(C级\n); else if (score 80 score 90) printf(B级\n); else if (score 90) printf(A级\n); else printf(D级\n); ​ // 一个表达式中既有逻辑运算符又有关系运算符这个表达式就被称作复合表达式 } int main(int argc,char *argv[]) { if_test1(); if_test2(); ​ return 0; }三目运算符条件运算符语法格式语法表达式1 ? 表达式2 : 表达式3;核心说明①表达式1为真 → 执行表达式2结果为表达式2的值②表达式1为假 → 执行表达式3结果为表达式3的值③ 本质是单表达式双分支if的简写仅适用于单语句场景不能替代复合语句④ 运算符优先级从高到低逻辑非(!) → 算数运算符(* / %→ -) → 关系运算符( → !) → 逻辑运算符→||→三目运算符(?:)→赋值运算符( - * /...)优先级验证案例简化三个数求最大值和最小值需求输入a,b,c三个整数用三目运算符求最大值和最小值。/************************************************************************* File Name: demo08.c Author: *** Description: 三目运算符a, b, c最大最小值 Created Time: 2026年08月06日 星期四 08时52分19秒 ************************************************************************/ ​ #include stdio.h ​ int main(int argc,char *argv[]) { // 创建变量a, b, c, max, min; int a, b, c, max, min; ​ printf(请输入三个整数\n); scanf(%d%d%d, a, b, c); ​ // 使用三目运算符求最大值 max (a b) ? (a c ? a : c) : (b c ? b : c); // 使用三目运算符求最小值 min (a b) ? (a c ? a : c) : (b c ? b : c); ​ printf(%d,%d,%d中的最大值是%d,最小值是%d\n, a, b, c, max, min); ​ return 0; }运行结果an-vm:/mnt/hgfs/code/20260804$ gcc demo08.c an-vm:/mnt/hgfs/code/20260804$ ./a.out 请输入三个整数 25 34 28 25,34,28中的最大值是34,最小值是25用switch语句实现分支结构switch语句专门用来实现多分支选择结构多路分支适用于条件为离散值整形、字符型的场景。语法格式switch (表达式) // 表达式结果为离散值int、char、enum(枚举符号常量) { case 常量表达式1: // 常量表达式字面量123.14、符号常量PI、枚举值LEFT/RIGHT // { 笔试中可能会出现这样的代码 语句1; break; // 跳出switch语句 // } case 常量表达式2: 语句2; break; ... case 常量表达式n: break; default: // default一般写在所有case的最下面无匹配case时执行类似于if多分支的else 语句n1; break; // 若default写在所有case的下面break可以省略掉否则必须添加 }注意switch的{}必须保留case后的语句可用{}包裹一般省略case和default的顺序没有固定语法要求表达式和常量表达式之间是等值判断核心说明①表达式类型限制结果必须是整型int、long或字符型char不能是浮点型或字符串因为case标签要求整形常量表达式浮点数和字符串不是整形编译时无法作为分支跳转目标。②case常量唯一性每个case后的常量表达式值必须不同否则编译报错如同一个switch中不能出现两个case 2:switch (..) { case 2: ... break; case 2: // 错误常量必须唯一不能重复 ... break; }③执行顺序先计算表达式值匹配对应的case 常量表达式并执行后续语句无匹配时执行default。④break穿透若case后无break执行完当前case语句后会继续执行下一个case直到遇到break或switch结束。/************************************************************************* File Name: demo09.c Author: *** Description: 多分支-switch:break穿透 Created Time: 2026年08月06日 星期四 19时18分25秒 ************************************************************************/ ​ #include stdio.h ​ int main(int argc,char *argv[]) { // 创建一个变量num并赋值为1 int num 1; ​ switch (num) { case 1: printf(A\n); // 无break case 2: printf(B\n); // 有break break; case 3: printf(C\n); break; } ​ return 0; }运行结果an-vm:/mnt/hgfs/code/20260804$ gcc demo09.c an-vm:/mnt/hgfs/code/20260804$ ./a.out A B⑤多case共用语句/************************************************************************* File Name: demo10.c Author: *** Description: 多分支switch多case共用语句 Created Time: 2026年08月06日 星期四 19时34分27秒 ************************************************************************/ ​ #include stdio.h ​ int main(int argc,char *argv[]) { // 根据月份判断季节 int month; ​ printf(请输入月份(1~12)); scanf(%d, month); ​ switch (month) { case 3: case 4: case 5: printf(春季\n); break; case 6: case 7: case 8: printf(夏季\n); break; case 9: case 10: case 11: printf(秋季\n); break; case 12: case 1: case 2: printf(冬季\n); break; default: // default类似于if分支中的else printf(请输入1~12的整数\n); } ​ return 0; }运行结果yueqianyueqian-vm:/mnt/hgfs/code/20260804$ gcc demo10.c yueqianyueqian-vm:/mnt/hgfs/code/20260804$ ./a.out 请输入月份(1~12)3 春季 yueqianyueqian-vm:/mnt/hgfs/code/20260804$ ./a.out 请输入月份(1~12)6 夏季 yueqianyueqian-vm:/mnt/hgfs/code/20260804$ ./a.out 请输入月份(1~12)10 秋季 yueqianyueqian-vm:/mnt/hgfs/code/20260804$ ./a.out 请输入月份(1~12)2 冬季