C语言第五天/分支与循环 if语句if(表达式){语句1;}else{语句2;}由此结合前面学到的可以写一个判断奇偶数的程序#include stdio.h int main(){ int num; scanf(%d,num); if (num % 2 0){ //能被2整除为偶数反之为奇数 printf(偶数); }else{ printf(奇数); } return 0 }或是一个输入年龄判断是否成年#include stdio.h int main(){ int age; scanf(%d,age); if (age 18){ //小于18则输出未成年反之成年 printf(未成年); }else{ printf(成年); } return 0; }如果不加{ }的话if和else语句默认只能控制一条语句为未来修改程序方便最好是加上{ }嵌套if语句普通的if语句只能判断最多两个条件可以通过嵌套if语句来形成多重判断。要求输入一个整数判断输入的整数是0还是正整数或者负整数。#include stdio.h int main(){ int num; printf(请输入整数); scanf(%d,num); if(num 0){ printf(输入的整数为0); }else { if (num 0){ printf(输入的整数为负整数); }else { if (num0){ printf(输入的整数为正整数); } } return 0; } }当然由于这样嵌套可读性比较差而嵌套的顺序图与不使用嵌套转而使用多重判断可读性更高个人认为#include stdio.h int main(){ int num; printf(请输入整数); scanf(%d,num); if(num 0){ printf(输入的整数为0); }else if (num 0) { printf(输入的整数为负整数); }else if (num0) { printf(输入的整数为正整数); } if (num % 2 0){ //能被2整除为偶数反之为奇数 printf(偶数); }else{ printf(奇数); } return 0; }可以转而使用这种写法 在else后面直接加上if个人粘合了前面写的奇偶判断。悬空else问题如果有多个if和else可以记住这样一条规则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; }其中最底部的else并不是与最初的if语句匹配而是与最近的if b2匹配输出为空加上大括号后正常匹配但不代表这样写没有问题的缩进具有欺骗性虽然else实际上与外部的if (a 1)配对因为外部if使用了花括号{}明确界定了其范围但缩进让读者容易误以为else属于内部的if (b 2)。如果将来有人修改代码时不小心删除了外部if的花括号else就会立即变成内部if的匹配项从而改变逻辑产生“悬空else”经典问题。#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; }关系操作符主要有6个关系运算符 大于运算符 小于运算符需要连用时可以使用进行连接表示并且 大于等于运算符 小于等于运算符 相等运算符 赋值运算符! 不相等运算符注多个关系运算符不宜连用#include stdio.h int main(){ int a 3; int b 8; int c 5; if (a b c){ printf(gg\n); } return 0; }38但8!5依旧会打印gg因为在ab时成立而不是顺序下来判断。所以可以使用#include stdio.h int main(){ int a 3; int b 8; int c 5; if (a b b c){ printf(gg\n); } return 0; }相等于运算符有的时候很容易把写成像以下这样写时程序会报错if 3 a//程序报错……if a 3/*程序并不会报错但是无论输入什么这段都会通过因为是赋值运算符而赋值成功后a3自然就通过了*/……条件操作符条件操作符又称三目运算符需要三个操作数。exp1 ? exp2 : exp3如果exp1为真运行exp2如果为假运行exp3#include stdio.h int main(){ int a; scanf(%d,a); a 0 ? printf(正整数) : printf(负整数); //判断正负 return 0; }#include stdio.h int main(){ int a 0; int b 0; scanf(%d %d, a , b); int max (a b ? a : b); //比大小 printf(%d,max); return 0; }逻辑操作符! 逻辑取反操作符改变单个表达式的真假 逻辑与操作符并且两侧的表达式都为真则为真反之为假|| 逻辑或运算符或者两侧的表达式至少有一个为真则为真反之为假| c语言中非0为真0为假逻辑取反#include stdio.h int main(){ int flag 0; scanf(%d, flag); if (flag) { printf(真); // if (flag 0) // { // printf(假); // } }else if(!flag) { printf(假); } return 0; }其中注释掉的段与后面写出来的运行结果是相等的逻辑与运算符a与b都为真则为真a为真b为假则为假a为假b为真则为假a与b都为假则为假而是一个双目运算符如果3月到5月是春天那么使用表示则是#include stdio.h int main(){ int month 0; scanf(%d, month); if (month 3 month 5) { printf(现在是春天); }else { printf(现在不是春天); } return 0; }逻辑或运算符a与b都为真则为真a为真b为假则为真a为假b为真则为真a与b都为假则为假如果一年中的12月或1月或2月是冬天#include stdio.h int main(){ int month 0; scanf(%d, month); if (month 12 || month 1 || month 2) { printf(现在是冬天); }else { printf(现在不是冬天); } return 0; }练习判断闰年/*需求分析判断闰年世纪年必须能被400整除才是闰年。普通年能被4整除且不能被100整除的为闰年。 可得 被4整除且不能被100整除或被400整除*/ #include stdio.h int main(){ int year 0; scanf(%d, year); if (year % 4 0 year %100 ! 0) { printf(%d年,是闰年,year); }else if (year % 400 0) { printf(%d年,是闰年,year); }else { printf(%d年,不是闰年,year); } return 0; } 还可以更简化一点 #include stdio.h int main(){ int year 0; scanf(%d, year); if (year % 4 0 year %100 ! 0 || year % 400 0) { printf(%d年,是闰年,year); }else { printf(%d年,不是闰年,year); } return 0; }短路逻辑运算符还有一个特点它总是先对左侧的表达式求值再对右边的表达式求值。如果左边的表达式满足逻辑运算符的条件则不会再对右侧表达式进行逻辑判断称为“短路”代入逻辑运算符左边为假右边不再计算||左边为真右边不再计算a是先赋值再自增此时a0 为假在逻辑运算符中左边为假右边不再计算得后面的b与d也不再进行整行代码最终动作只有判断为假不再运行后面的b同时a自增。所以最后a1 b2 c3 d4计算 a表达式的值是0因为 a 初始为 0先取值再自增。副作用a立刻变为1。短路发生因为运算符要求两边都为真结果才为真。现在左边是0假编译器知道整个(0 ...)的结果必定是0假。为了提升效率编译器直接跳过后面所有的表达式不再计算b和d。最终结果a经历了一次自增 →1。b因为被短路跳过没有执行前置自增 → 保持2。c全程未参与任何操作 → 保持3。d因为被短路跳过没有执行后置自增 → 保持4。i整个逻辑表达式结果为0假所以i被赋值为0a 1b 2c 3d 4计算aa2为真根据||左边为真后面的不再运行得b与d都维持原数据所以a2 b2 c3 d4swich语句swich语法swich (整型表达式) //括号内必须是整型表达式—结果是整型{case: value1: staement //case后面的值必须是整型常量表达式case: value2: staementcase: value3: staementcase: value4: staement…default:statement}与if语句的对比需求输入任意一个整数值计算除3之后的余数/*需求分析输入任意一个整数值计算除3之后的余数。任何整数除以3之后的余数只会出现0、1、2*/ int main(){ int num1 0; printf(请输入一个整数:\n); scanf(%d,num1); if (num1 %3 0) { printf(该数可以被3整除); }else if (num1 %3 1) { printf(该数除3之后的余数为1); }else if (num1 %3 2) { printf(该数除3之后的余数为2); } return 0; }那么如果使用swich语句将是int main(){ int num1 0; printf(请输入一个整数:\n); scanf(%d,num1); switch (num1 %3) { case 0: printf(该数可以被3整除); break; case 1: printf(该数除3之后的余数为1); break; case 2: printf(该数除3之后的余数为2); break; default: printf(错误跳出循环); break; } return 0; }就代码简洁性来说swich比if更加工整且重复度不高。但是在适用范围来看if语句更好因为其基本支持任何语句而swich语句仅能用于int整型的离散值匹配。若未来需求变为“判断数字是否在某个区间”或“判断字符类型”等复杂条件则必须改用 if语句switch语中的break如果没有加上break的话程序会穿透执行下一个case代码所以如果没有特殊需求的话可以在每段case结尾加上breakswitch语句中的default任务用户输入1时打印星期一2时打印星期二以此类推到输入7时打印星期日int main(){ int day 0; printf(请输入1-7任意一个数字:\n); scanf(%d,day); switch (day) { case 1: printf(星期一); break; case 2: printf(星期二); break; case 3: printf(星期三); break; case 4: printf(星期四); break; case 5: printf(星期五); break; case 6: printf(星期六); break; case 7: printf(星期日); break; default: printf(错误,请输入1-7任意一个数字); break; } return 0; }在最后一次运行我将default注释掉后可以发现输入错误整型后并没有任何提示告诉我输入错误了。加上default后当程序发现并不是在case范围内之后会输出提示信息交互性更强。while循环语句c语言提供了三种循环语句分别是while、for、do while而while循环的语法结构与if语句相似if与while的对比//if与whlie对比 if(表达式) 语句; while (表达式) 语句;while语句的执行流程先判断表达式值为0假时结束值为非0真时进入执行语句语句执行完再继续判断是否进入下一次判断。int main() { int i 1; while (i 6) { //当i小于等于6时执行以下语句 printf(%d, i); i; //执行完语句后i } return 0; }练习逆序输出输入一个正的整数逆序打印这个整数的每一位例如:输入:1234,输出:4 3 2 1输入:521,输出:1 2 5int main() { int num 0; scanf(%d,num); while (num) { printf(%d, num % 10); num num/10; } return 0; }使用取余运算首先输入1234得出余数为4然后将1234除以10得到123.4由于是整型变量所以将舍弃小数循环后123取余为3……最后取余为11除10得到00为假退出循环for循环语句for循环语法for (表达式1 ; 表达式2 ; 表达式3){语句;}表达式1用于循环变量的初始化表达式2用于循环结束条件的判断表达式3用于循环变量的调整for ( i 0; i 6; i){printf(%d , i);}for语句的执行流程首先对表达式1进行初始化根据表达式2的条件判断为假结束为真则进入循环语句执行完后运行表达式3对变量进行调整直到变量满足跳出循环的判断条件。while与for的对比练习打印1-10的整数#include stdio.h int main() { for ( int i 1 ; i 10 ; i) { printf(%d ,i); } return 0; }计算1~100之间3的倍数的数字之和//需求分析输出1-100并输出能被3整除的数字进行累加 #include stdio.h int main(){ int sum 0; for (int i 1 ; i 100; i) { if (i %3 0) { printf(%d\n,i); sum sumi; } } printf(被3整除的数字的和为:%d, sum); return 0; }do-while循环语句do-while语法do语句;while(表达式);while和for这两种循环都是先判断条件如果满足就进入循环执行循环语句如果不满足就跳出循环;而dowhile循环则是先直接进入循环体执行循环语句然后再执行while后的判断表达式表达式为真就会进行下一次表达式为假则不再继续循环。do-while语句的循环流程先执行语句随后判断表达式非0时继续执行为0假时结束语句do while 循环实例在屏幕上打印1~10的值#include stdio.h int main(){ int i 1; do { printf(%d, i); i; } while (i 10); return 0 ; }练习输入一个正整数计算这个整数是几位数//任务输入一个正整数计算这个整数是几位数 //需求分析取余记录,需要一个存储输入的整型一个记录位数的整型 #include stdio.h int main(){ int num,num1; int Num_times 0; printf(请输入一个正整数\n); scanf(%d,num); do { num num / 10; //num除法利用整型特性去掉末尾的一位数 Num_times; //记录位数 } while (num); printf(这个整数是%d位数, Num_times); }break和continue语句在循环执行的过程中如果某些状况发生的时候需要提前终止循环这是非常常见的现象。C语言中提供了break和continue两个关键字就是应用到循环中的。break的作用的用于永久跳出循环只要break被执行就会直接跳出循环继续往后执行continue的作用是跳过本次循环中continue后面的代码在for循环和while中有所差异在某种条件发生的时候希望跳出循环时则可以使用break来进行。while中的break的continue#include stdio.h int main (){ int i 0; while (i 10) { printf(%d, i); i; if (i 5){ break; } } retrun 0; }当运行到i 5时触发break跳出循环。#include stdio.h int main (){ int i 0; while (i 10) { i; if (i 5){ continue; } printf(%d, i); } retrun 0; }当运行到i 5时触发continue这次循环不再执行后面的语句进入下次循环。for中的break和continue#include stdio.h int main (){ for (int i 0; i 10; i) { printf(%d,i); if (i 5) { break; } } return 0; }当运行到i 5时触发break跳出循环。#include stdio.h int main (){ for (int i 0; i 10; i) { if (i 5) { continue; } printf(%d,i); } return 0; }当运行到i 5时触发continue这次循环不再执行后面的语句i也是在这次循环中的进入下次循环通过流程图可以看到continue在while循环中必须要将i放置在continue前面如果在后面的话程序会无限循环卡死但在for循环中不会因为continue跳出的是循环内部的代码而i并不在内部。do-while中的break和continue与while循环基本一致goto语句C语言提供了一种非常特别的语法就是goto语句和跳转标号goto语句可以实现在同一个函数内跳转到设置好的标号处。#include stdio.h int main (){ printf(yes or no:\n); goto next; printf(no); next: printf(yes); return 0; }goto语句如果使用不当就会导致在函数内部随意乱跳转尽量不用但是goto语句在多层循环嵌套的代码中想快速跳出循环使用goto语句就非常的方便了。死循环案例#include stdio.h int main (){ next: printf(yes or no:\n); goto next; printf(no); printf(yes); return 0; }

本月热点