
前言这篇笔记我改了又改总是认为表述的不够清晰在写的同时我也学习了很多可能会比较长但我希望你们能耐心读下去希望这篇笔记能够帮助还在困惑之中的人C语言真的很有意思我们都要坚持学习下去目录1.C语言的三大结构2.单条if语句3.多条if语句4.关系操作符5.条件操作符6.逻辑操作符7.switch语句8.操作符的总结C语言的三大结构C语言是一门有结构的语言在C语言中有三大结构分别是顺序分支和循环其实现在想想还真的很佩服那些创造C语言的人因为他们根据自己极强的抽象能力将生活中事物运行发展的规律抽象成这三大结构。其实我们的生活也是有着三大结构构成的我们会过完这一天按照自己的节奏这就是顺序我们在生活中会做出很多的选择选择是吃这一顿饭还是不吃选择看这个视频还是看那个视频这就是分支我们的时间都是按照周一到周日来进行周日之后就是新的一周这其实就是循环什么是分支分支是一种程序控制的结构根据某个条件的真假*从两条路或者多条执行路径中选择一条执行一个完整的分支包括三个要素一个条件(判断)两条路或多条路径根据条件选一条路走我们画出一个分支的流程图来理解一下这是一个经典的分支的流程图根据条件的真假来判断执行哪一条路径当然还有别的我们现在就来进行学习单个分支单个分支最简单的就是这样当条件为真执行路径1当条件为假什么都不做我们就叫做空路径写成代码的样子就是这样以这样一道题目为例判断一个是否为奇数int main() //输入一个整数判断是不是奇数 { int a 0; //输入 scanf(%d, a); //判断 if (a % 2 1) printf(%d是一个奇数\n, a); return 0; }if后面的圆括号的内容就是条件(a % 2 1)如果等于1这个表达式就会返回一个1条件为真执行if后面的语句如果不等于这个表达式就会返回一个0表示假但是这里是个空路径就什么也不执行注意每一个表达式都有自己的返回值一个单独的变量常量都可以是一个表达式在C语言中0表示假非0表示真1可以表示真2也可以表示真-2也可以表示真只要不是0如果我们输入一个33与2取余得到的结果就是1条件为真输出这是一个奇数但是输入2取余的结果不为1条件为假但什么都不做下面我们再看进阶一点的进阶一点的流程图就是这个此时这个路径就是不再是空路径我们仍然以一道为例刚刚的题目再加一句偶数时输出是偶数我们可以出这样的代码int main() //输入一个整数判断是不是奇数 { int a 0; //输入 scanf(%d, a); //判断 if (a % 2 1) printf(%d是一个奇数\n, a); else printf(%d是一个偶数\n, a); return 0; }当(a % 2 1)为真时执行if后面的的语句为假执行else后面的语句我们这里必须知道else与圆括号中的条件进行配对当圆括号内的条件为假时就执行当我们写出多个if语句时必须知道else是和哪个条件进行配对的后面我会用我写的一个bug程序来解释再看一道例题当成绩大于等于60时输出拿捏拿捏当成绩小于60时输出补考补考我们的条件是成绩是否大于等于60如果条件为真执行输出拿捏拿捏如果条件为假输出补考补考流程图写出这样的代码int main() //判断成绩 { int score 0; //输入 scanf(%d, score); //判断 if (score 60) printf(拿捏拿捏\n); else printf(补考补考\n); return 0; }else配对的时score 60这个条件当这个条件为假的时候执行else后的语句多条语句问题if后面只能放一条语句如果要放多条就要用花括号括起来写代码的时候用花括号括起来是一个好的习惯else也是同理如果我们想在当成绩大于等于60的时候再输出一个庆祝庆祝错误的写法是这样的int main() //多条语句 { int score 0; //输入 scanf(%d, score); //判断 if (score 60) printf(拿捏拿捏\n); printf(庆祝一下\n); return 0; }运行程序当我们输入一个56也会输出庆祝庆祝证明这个输出语句并不在if的控制范围是一条单独的语句正确的写法是这样的int main() //多条语句 { int score 0; //输入 scanf(%d, score); //判断 if (score 60) { printf(拿捏拿捏\n); printf(庆祝一下\n); } return 0; }用花括号括起来只有在条件为真时才会执行这条语句多个分支if-else if 型多个分支语句我们就经常采用嵌套的结构嵌套结构的流程图如下我们仍然以一道题目为例题目超市做活动满50减15满30减8满20减5不满20不参加活动输入总价输出做过活动的金额我们可以写出这样两种代码一种是从大到小一种从小到大int main()//从小到大 { float total 0.0f; //输入 scanf(%f, total); //判断 if (total 20) { printf(未满20不参加活动\n); } else if (total 30) { printf(满20减5元应付%.2f\n, total - 5); } else if (total 50) { printf(满30减8元应付%.2f\n, total - 8); } else { printf(满50减15应付%.2f\n, total - 15); } return 0; }int main()//从大到小 { float total 0.0f; //输入 scanf(%f, total); //判断 if (total 50) { printf(满50减15实际付款%.2f\n, total - 15); } else if (total 30) { printf(满30减8实际付款%.2f\n, total - 8); } else if (total 20) { printf(满20减5实际付款%.2f\n, total - 5); } else { printf(不满20不参加活动\n); } return 0;我们讲一下从大到小的代码逻辑我们输入一个数开始进行判断如果总价大于等于50为真我们就执行减15如果为假我们就来进行判断总价是否大于等于30条件为真就进行减8如果为假我们接着判断是否大于等于20如果条件为真就减5如果为假就不能参加活动本来如果不嵌套的话如果条件为假我们可能就直接执行一条语句就结束了但是有了嵌套在为假的时候我们就应该再次进行判断流程图为下if 内部多个if我们来看一道例题成绩大于等于85没有挂课没有处分有奖学金不满足其中一条就没有评奖资格输入自己的情况输出结果这道题我们的流程图可以这样画我们首先要判断成绩是否大于等于85如果条件为真要接着判断挂科是否等于0如果为假就输出成绩不合格不能参与评奖如果挂科这个条件为真我们就接着判断处分是否等于0如果为假就输出挂科了不能参与评奖如果处分这个条件为真就输出有奖学金如果这个条件为假就输出有处分不能参与评奖这个跟上面的是相反的本来如果没有这个嵌套我们if判断为真之后就要执行一条语句但是现在要就继续进行一次判断编写出这样的程序int main()//评奖学金 { int score 0; int fail 0; int warning 0; //输入 scanf(%d%d%d, score, fail, warning); //判断 if (score 85) { if (fail 0) { if (warning 0) { printf(有奖学金\n); } else { printf(有处分不能参与评奖\n); } } else { printf(挂科了不能参与评奖\n); } } else { printf(成绩不合格不能参与评奖\n); } return 0; }有趣的是在当时我写这个程序写出来一个错误的程序我是这样写的int main() //评奖学金-bug { int score 0; int fail 0; int warning 0; //输入 scanf(%d%d%d, score, fail, warning); //判断 if (score 85) { if (fail 0) { if (warning 0) { printf(有奖学金\n); } } } else { printf(不能参与评奖\n); } }在写这段程序时我是这么想的我进行了嵌套然后进行输入只要有一个不符合条件程序就会输出不能参与评奖程序写好之后我进行测试输入66 1 0输出了但是当我输入99 0 1的时候竟然没有输出我才意识到这个程序里有一个bug我觉得既然我的所有的if语句都嵌套在一个if语句中就可以看成一个整体当有一个条件为假时就会跳出if语句去执行else语句但这是真的吗肯定不是我之前说了每一个else语句的执行都应该匹配一个圆括号里的条件在这里这个else匹配的时第一个if就是(score 85)的这个条件else执行的唯一情况就是这个条件为假的时候else不会说这个if中的3个if看成一个整体它只认一个圆括号中的条件不管你嵌套了几个这个错误程序的流程图就是这个画流程图真的是一个很好的习惯可以保持自己的思路是清晰的不会写出错误的程序悬空else问题如果有多个ifelse一般就和最近的还没有配对的if结合看下面这个程序int main() //悬空else { int a 0; int b 2; if (a 2) if (b 2) printf(haha\n); else printf(hehe\n); return 0; }这个程序在进行运行后什么都没有输出证明什么证明这个else就没有和第一个if配对而是和第二个if配对这个if就是距离最近的if如果都加了花括号int main() //悬空else 2 { int a 0; int b 2; if (a 2) { if (b 2) { printf(haha\n); } } else { printf(hehe\n); } return 0; }此时输出了hehe因为这时第二个if就不是距离最近的if距离最近的时第一个if第二个if离这个else中间还隔了一个花括号关系操作符在上一篇笔记中我们学习了赋值操作符算术操作符自增自减我们来看关系操作符关系操作符有这几种关系操作符和操作数会构成关系表达式关系表达式就会返回两个值一个是1表示真一个是0表示假要注意赋值运算符和这个 不能混用int main()// 和 { int a 2; if (a 3) { printf(哈哈\n); } else { printf(呵呵\n); } return 0; }这个程序运行后是呵呵“但是如果我们把 改成会发生什么int main()// 和 { int a 2; if (a 3) { printf(哈哈\n); } else { printf(呵呵\n); } return 0; }运行后输出”哈哈“为什么我们首先要知道赋值表达式返回的值就是等号左边所获得的值a 3 ,这是一个赋值表达式不是关系表达式这个表达式的意思就给a这个变量赋值为3返回3这个值3是一个非零数前面就讲过所以这个条件为真执行打印哈哈所以不管我是2还是1还是100都会被赋值成3返回3这个条件就一直为真只能输出打印哈哈我们如果在写 这个的时候可以养成这样一个好习惯将常量放在右边如果写成 就会报错不至于有bug出现多个关系运算符不可以连用int main()//多个关系运算符连用 { int a 4; if (1 a 3) { printf(haha\n); } return 0; }这个程序在运行后打印了一个haha但是不应该打印一个haha因为4并不是一个大于1且小于3的数因为在C语言中关系运算符是从左到右开始计算先计算第一个再计算第二个等等1 4 3是这样算的先算1 4这个为真返回1将这个1和3进行比较1 3,这个表达时的返回值是1所以这个条件为真输出haha但真实情况不应该输出一个haha所以在C语言中多个关系运算符是不可以连用的那我们应该怎么办就用到了逻辑操作符我们先讲一下条件操作符再讲逻辑操作符条件操作符条件操作符也叫三目操作符有三个操作数形式如下exp1 ? exp2 : exp3意思就是说当exp1这个条件为真时执行exp2如果为假执行exp3其实跟if很相似操作数最好是表达式不能是函数什么的会很危险条件表达式的返回值就是执行的表达式的值看一道题目找出两个数的最大值int main() //找出两个数的最大值 { int a 0; int b 0; int max 0; scanf(%d%d, a, b); if (a b) { max a; printf(最大值为%d\n, max); } else { max b; printf(最大值为%d\n, max); } return 0; }If语句写出来就是这样的用条件操作符写出来的程序是这样的int main()//找出两个数中的最大值 { int a 0; int b 0; int max 0; scanf(%d%d, a, b); max a b ? a : b; printf(最大值是%d\n, max); }比较简洁这个程序的意思就是如果 a b这个条件为真就执行 a返回a的值如果为假就执行b返回b的值max a b ? a : b这其实就是一个表达式同样也是可以嵌套的嵌套的逻辑和if的逻辑完全一样但不建议嵌套太深对齐写看一道例题给暗恋对象发送信息在一分钟内回就是有戏在十分钟内回就是ta可能在忙在一小时内回还是去打游戏吧超过一个小时还是代码香int main() //回信息 { int mintue 0; //输入 scanf(%d, mintue); //输出 printf(%s\n, mintue 1 ? 有戏 : mintue 10 ? ta可能在忙 : mintue 60 ? 去打游戏吧 : 还是代码香); return 0; }就是这样的上面评奖学金的那道题也可以用条件操作符来写int main() //评奖学金-条件表达式 { int score 0; int fail 0; int warning 0; //输入 scanf(%d%d%d, score, fail, warning); //输出 printf(%s\n, score85 ?(fail0 ? (warning0 ? 有奖学金 : 有处分不能参与) :有挂科不能参与) : 成绩不合格不能参与); return 0; }这样写也行但是可读性不高而且写长串还要去对齐有点麻烦逻辑操作符逻辑操作符用来逻辑判断构建更复杂的表达式逻辑运算符的返回值也是0或1一共是这三个逻辑取反运算符 如果表达式的的真就会反取成假的比如一个表达式是33是一个非0的数表达式是真如果进行了取反就变成了假int main() //取反 { int flag 0; scanf(%d, flag); if (flag) //如果flag为真 { printf(do something\n); } if (!flag)//flag如果是假取反后就是真就会执行下面的语句 { printf(do something\n); } return 0; }其实这个程序和if-else结构是一样的逻辑与运算符 与运算符只有同时为真才为真上面我们在说关系运算符时说关系运算符不可以连用那我们应该怎么写这个程序呢就用到了与运算符int main()//与运算符 { int a 4; if (1 a a 3) { printf(haha\n); } return 0; }1 a a 3只有当两者同时为真的时候才会返回1条件才为真才会输出haha1 4返回一个14 3返回一个0 1 0返回的值是0条件为假不执行所以不输出逻辑或运算符 ||或运算符只要有一个为真就会返回1比如一年的12月份或者1月份或者2月份是冬天int main() //冬天 { int month 0; //输入 scanf(%d, month); //判断 if (month 12 || month 1 || month 2) { printf(该月是冬天\n); } return 0; }当month 12 时 返回一个1其他都返回一个01 || 0 返回11 || 0返回1条件为真输出再看一道题判断某年是不是闰年判断方法能被 4 整除且不能被 100 整除或者能被 400 整除。int main()//闰年 { int year 0; scanf(%d, year); if (year % 4 0 year % 100 ! 0 || year % 400 0) { printf(该年是闰年\n); } return 0; }再看一道让玩家和电脑玩石头剪刀布int main() //石头剪刀布 { char player 0; char computer 0; // 石头s // 剪刀 c //布b scanf(%c %c, player, computer); //判断有三种情况平局玩家赢电脑赢 if (player computer) //平局 { printf(平局\n); } else if (player s computer c || player c computer b || player b computer s) //玩家赢 { printf(玩家获胜\n); } else { printf(电脑获胜); } return 0; }短路逻辑运算符在求值的时候会从左边开始求值如果左边的表达式已经满足了逻辑运算符的运算条件就不再对右边的表达式求值这就叫做短路\int main()//短路1 { int i 0, a 0, b 2, c 3, d 4; i a b d; printf(a%d\nb%d\nc%d\nd%d\n, a, b, c, d); return 0; }看一下这个程序a0a是a先使用再自增所以在i a b d,中a0但是与运算符要求全部为1才会返回1只要出现一个0就返回0a0整个表达式就直接返回0i0后面的就都不去算了b和d都没有运算保持原样所以输出a1,b2,c3,d4int main()//短路2 { int i 0, a 1, b 2, c 3, d 4; i a b d; printf(a%d\nb%d\nc%d\nd%d\n, a, b, c, d); return 0; }把a的值换成1那么就会一直算直到算完或者出现第一个0先算a1b3a b1继续算141,所以i1a2,b3,c3,d5int main()//短路3 { int i 0, a 1, b 2, c 3, d 4; i a|| b || d; printf(a%d\nb%d\nc%d\nd%d\n, a, b, c, d); return 0; }或运算只要出现一个1就可以停止运算返回1没有出现就一直算直到算完或出现第一个1这个a1所以就直接返回1i1后面的都没算a2,b2,c3,d4int main()//短路4 { int i 0, a 0, b 2, c 3, d 4; i a || b || d; printf(a%d\nb%d\nc%d\nd%d\n, a, b, c, d); return 0; }a0,接着向后算b3, 0||31,后面的就不算了直接返回1i1a1,b3,c3,d4switch 语句基本结构switch (表达式) { case 常量1 语句1; break; case 常量2 语句2 break; ... defalut: 语句n; break }表达式的返回值必须是一个整型数intshort ,long,char,都可以不可以是浮点型case后跟的也必须是一个整型常量不可以是变量case和整型常量中间有一个空格当表达式的返回值是常量1就执行语句1是常量2就执行语句2都不是就执行defalut的语句其实也是和if很像但结构更加简洁看一例题输入一个整数值计算与3取余的余数int main()//余数 { int a 0; scanf(%d, a); switch (a % 3) { case 0: printf(余数是0\n); break; case 1: printf(余数是1\n); break; case 2: printf(余数是2\n); break; } return 0; }如果不加break会发生什么去情况int main()//余数 { int a 0; scanf(%d, a); switch (a % 3) { case 0: printf(余数是0\n); case 1: printf(余数是1\n); case 2: printf(余数是2\n); } return 0; }break就是指出要在哪里跳出这个函数如果没有break就会一直执行语句case告诉从哪里进入我输入一个3就会输出余数是0 余数是1 余数是2从case 0那里进入但是中间由于没有break,就一直执行int main() { int n 0; scanf(%d, n); if (n % 3 0) { printf(余数是0\n); } if (n % 3 1) { printf(余数是1\n); } else { printf(余数是2\n); } }if的没有switch那么明了简洁再看一到例题 : 输入1到7打印对应的星期几int main()//星期几 { int day 0; scanf(%d, day); switch (day) { case 1: printf(zhouyi\n); break; case 2: printf(zhouer\n); break; case 3: printf(zhousan\n); break; case 4: printf(zhousi\n); break; case 5: printf(zhouwu\n); break; case 6: printf(zhoului\n); break; case 7: printf(zhouri\n); break; } }如果改一下1到5输出早八6到7输出睡觉我们如果在每一个case后都写就有一点繁琐我们可以让比如在周五的时候输出一次周一周二都不break这样就不会从函数中跳出直到遇见第一个breakint main()//早八 { int day 0; scanf(%d, day); switch (day) { case 1: case 2: case 3: case 4: case 5: printf(早八\n); break; case 6: case 7: printf(睡觉\n); break; } }最后是关于defalut它不一定放在最后可以放在任意位置但else不可以if的很多时候switch都不能代替switch只能等于不可以做判断switch类似于去比对每一个值表达式返回值得总结表达式返回值赋值表达式左边变量获得的值算术表达式计算的结果关系表达式0或1条件表达式执行表达式的返回值逻辑表达式0或1这篇笔记到这里就结束了如果有任何问题可以在评论区提出来欢迎大家交流下一片更新有关循环的知识点请大家多多点赞收藏我们下次再见