)
C语言第三讲分支和循环上第三讲目录1 if语句1.1 if1.2 else1.3 分支中包含多条语句1.4 嵌套if1.5 悬空else问题2 关系操作符3 条件操作符三目运算符4 逻辑操作符 ! 、 、 ||4.1 ! 逻辑反运算4.2 逻辑与4.3 || 逻辑或4.4 闰年判断4.5 短路特性5 switch操作符5.1 if / switch对比5.2 default6 while循环6.1 if 和 while对比6.2 while执行流程6.3 while实践打印1~106.4 练习输入正整数逆序打印每一位7 for循环三种循环最常用7.1 语法形式7.2 for执行流程7.3 实践打印1~107.4 while 和 for对比7.5 练习计算1~100之间3的倍数之和8 do while循环8.1 语法形式8.2 do while执行流程8.3 实践打印1~108.4 练习输入正整数求是几位数9 break 和 continue9.1 while里面break、continue9.2 for里面break、continue9.3 for循环变种9.4 do while中的break continue10 循环嵌套11 goto语句1 if语句1.1 ifif的基本形式if(表达式)语句;c语言中0为假非0为真表达式非0为真执行语句表达式为假0语句不执行C语言中 代表判断是否相等 代表赋值示例判断奇数cif(num % 2 1) 如果num对2取余结果为1printf(“奇数\n”); 1等于为真则输出奇数1.2 else基本形式if(表达式)语句1;else语句2;示例判断奇偶数cint num if(num % 2 1)printf(“奇数”);else不是奇则为偶printf(“偶数”);1.3 分支中包含多条语句默认if、else只能跟一条语句如果多条多条语句必须加大括号大括号内部称为代码块cif(age 18){printf(““);两行为一个整体一个代码块printf(””);必须用大括号1.4 嵌套ifelse可以和if连用实现多重判断示例1判断数字正负cint num;scanf(“%d”, num);if(num 0) 以下构成多重判断printf(“正”);else if(num 0)printf(“负”);elseprintf(“是0\n”);示例2输入整数判断是否为正数正数再判断奇偶否则输出非正cint num 0;scanf(“%d”, num);if(num 0){if(num % 2 1)printf(“奇\n”);elseprintf(“偶\n”);}elseprintf(“非正”);return 0;1.5 悬空else问题规则多条if elseelse总是和最近的if匹配cint a 0;int b 2;if(a 1if(b 2)printf(“hehe\n”);elseprintf(“haha\n”);✅提示代码排版非常重要推荐使用大括号避免歧义。2 关系操作符 、“”、 “、” “、” “、” ! 都是用来比较大小的运算符关系表达式返回 0假或1真⚠️注意判断是否相等用 不要写成赋值 推荐写法 if(2 a) 写错会直接编译报错多个关系运算符不能连用 ijk 是错误写法正确 ij 并且jk3 条件操作符三目运算符C语言非常特殊的操作符C语言唯一三目运算符格式 表达式1 ? 表达式2 : 表达式3表达式1为真 → 结果取表达式2表达式3不计算表达式1为假 → 结果取表达式3表达式2不计算示例cif(ab)ma;elsemb;等价于cm (a b ? a : b);4 逻辑操作符 ! 、 、 ||! 逻辑取反非改变表达式真假 逻辑与并且全部为真结果才为真|| 逻辑或或者有一个为真结果就为真4.1 ! 逻辑反运算aa0非010示例cint main(){int flag 0;scanf(“%d”, flag);if(!flag)printf(“hehe\n”);return 0;}4.2 逻辑与abab非0非01非0000非00000全真才真一假则假并且全满是cmonth 3 month 5;age 18 age 45;4.3 || 逻辑或aba或b非0非01非0010非01000有一个为真则真全假才假cmonth 12 || month 1 || month 2;4.4 闰年判断闰年规则能被4整除 并且 不能被100整除或者 能被400整除cint year 0;scanf(“%d”, year);if( (year%40 year%100!0) || year%4000 )printf(“闰年”);4.5 短路特性C语言逻辑运算符的一个特性从左向右计算如果左侧表达式满足逻辑运算符的条件则不对右侧表达式求值这个现象叫短路。 左边为假直接短路右边不执行cif(month 3 month 5)month3 结果为0直接整体为假后面不判断2. || 左边为真直接短路右边不执行示例代码分析cint a1,b2,c3,d4,i0;i a b d;// a先使用a1之后a变成2全部为真继续执行cint a1,b2,c3,d4,i0;i a || b || d;// a为真直接短路后面b、d全部不运行5 switch操作符switch是特殊的if…else多分支结构用于判断条件有多个结果的情况适合多结果判断可读性更好⚠️重点switch括号里面必须是整型表达式case后面必须是整型常量cswitch(表达式){case 结果1 : statement;case 结果2 : statement;…default : statement;}5.1 if / switch对比示例对3取余cint n 0;scanf(“%d”, n);if(n%3 0)printf(“余数为0”);else if(n%3 1)printf(“余数为1”);elseprintf(“余数为2”);等价switch写法cswitch(n % 3){case 0 :printf(“余数为0”);break;case 1 :printf(“余数为1”);break;default :printf(“余数为2”);}✅关键点case是入口break是出口跳出代码块break不是必须看业务需求没有break会继续向下穿透执行case、default没有强制顺序要求习惯default放最后5.2 defaultcase全部不匹配的时候执行default分支ccase 1:printf(“工作日”);break;case 6:case7:printf(“休息日”);break;default:printf(“输入错误”);break;6 while循环C三种循环 while 、 do while 、 forwhile 与for相似。快捷键 Ctrlz 撤销 Ctrlx 剪切6.1 if 和 while对比if(表达式) - while(表达式语句 语句同表达式为真执行语句表达式为假不执行语句。ifwhile后面默认只能跟一条语句代码快块多条语句必须加大括号6.2 while执行流程6.3 while实践打印1~10cint i 1;while(i 10){printf(%d , i);i;}6.4 练习输入正整数逆序打印每一位cint main(){int num 0;scanf(“%d”, num);while(num){printf(%d , num%10);num num / 10;}return 0;}7 for循环三种循环最常用7.1 语法形式cfor(表达式1;表达式2;表达式3)语句;如果循环体想包含更多的语句则要加上大括号表达式1循环变量初始化只执行1次表达式2循环终止条件判断表达式3循环变量调整for等价拆解为whilecint i 5;for中的表达式1while(i 10)表达式2{printf(“%d”, i);i;表达式3}7.2 for执行流程特点表达式1只执行1次7.3 实践打印1~10cint i 0;for(i 1; i 10; i){printf(%d , i);}return 0;7.4 while 和 for对比while三个表达式初始化、判断、调整分散在不同位置不利于维护for三个表达式集中在一起形式上for循环更优。7.5 练习计算1~100之间3的倍数之和写法1cint i 0, n 0;for(i 1; i 100; i){if(i % 3 0)n i;}printf(“%d\n”, n);写法2更优循环次数更少cint i 0, n 0;for(i 3; i 100; i 3){n i;}printf(“%d\n”, n);算法解决问题的办法。8 do while循环8.1 语法形式cdo{语句;}while(表达式);dowhile 条件更苛刻。✅特点循环体至少执行一次先执行后判断for、while有可能一次都不执行。适合必须先跑一遍逻辑的场景8.2 do while执行流程8.3 实践打印1~10cint i 1;do{printf(%d , i);i;}while(i 10);8.4 练习输入正整数求是几位数cint n 0,i 0;scanf(“%d”, n);do{n n / 10;i;}while(n ! 0);至少为1位数至少9 break 和 continuebreak永久终止整个循环一旦执行直接跳出循环continue跳过本次循环后面代码直接进入下一轮判断在for / while行为有差异9.1 while里面break、continuec// break示例i5直接结束循环只打印1,2,3,4int i 1;while(i 10){if(i 5)break;printf(“%d”, i);i;}c// continue示例i5跳过后面代码i不会死循环int i 1;while(i 10){if(i 5)continue;printf(“%d”, i);i;}9.2 for里面break、continuec// breaki5退出循环for(i1;i10;i){if(i 5)break;printf(“%d”,i);}c// continue跳过本次循环体但是会执行i不会死循环for(i1;i10;i){if(i 5)continue;printf(“%d”,i);}9.3 for循环变种for三个表达式都可以省略不写判断部分省略默认恒为真 → 死循环cfor(;{printf(“hehe”);}9.4 do while中的break continuecdo{if(i 5)break;printf(“%d”,i);i;}while(i 10);10 循环嵌套for、while、do while可以互相嵌套练习打印100~200之间素数原理ma*b则a、b至少有一个数 ≤ sqrt(m)判断到平方根即可需要头文件 math.hc#include stdio.h#include math.hint main(){int i 0;for(i 100; i 200; i){int flag 1;int k 0;for(k 2; k sqrt(i); k){if(i % k 0){flag 0;break;}}if(flag 1){printf(“%d\n”, i);}}return 0;}11 goto语句goto属于转向语句可以在同一个函数内部跳转到标记位置不可以跨函数跳转优点多层循环快速跳出缺点滥用打乱代码流程一般不推荐使用规则在一个函数内部使用适合多层循环跳出场景不用goto也可以实现同样效果示例1向后跳死循环cint main(){flag:printf(“hehe\n”);printf(“haha\n”);goto flag;return 0;}示例2向前跳跳过代码cint main(){goto next;printf(“haha”);next:printf(“hehe”);return 0;}案例定时关机小程序c#include stdio.h#include stdlib.h#include string.hint main(){char input[20] {0};again:printf(“1分钟后关机如果输入我是猪则取消关机\n”);scanf(“%s”, input);if(strcmp(input, “我是猪”) 0){system(“shutdown -a”);printf(“取消关机\n”);}else{goto again;}return 0;}说明 strcmp 字符串比较不能直接用 比较字符串system() 执行操作系统命令头文件 stdlib.hshutdown -s -t 60 60秒后关机 shutdown -a 取消关机可以用 while(1) 死循环替代goto