C语言初学日记:If-Else、Switch与短路求值的实战踩坑
今天学习了C语言的分支结构(if-else 和 switch)以及逻辑操作符(&&、||、!)。为了巩固知识,我手敲了几个经典案例,并测试了逻辑运算中的“短路现象”。整理如下:
【第一部分:逻辑运算符与经典“闰年”判断】
- 知识点:&&(逻辑与,全真才真)、||(两边都为真才为真)、!(逻辑非)
- 代码练习问题:判断某一年是不是闰年
intyear=2024;// 方法一:使用逻辑组合,最简洁if((year%4==0&&year%100!=0)||(year%400==0)){printf("%d 是闰年\n",year);}else{printf("%d 不是闰年\n",year);}3.我的错误及感受:使用 && 和 || 组合时,一定要用括号把条件括起来,不然运算优先级会乱!
【第二部分:大坑预警!逻辑运算符的“短路求值”】
- 测试代码:我今天特意写了一段代码来测试:
cinta=1,b=2,d=4;inti=a++&&++b&&d++;// 打印结果:a=2, b=2, d=4 (注意b和d没变!)- 踩坑原因:原来 && 左边如果是假(0),右边的代码根本就不会执行了!这叫做短路求值。同理,|| 的左边如果为真,右边也不会执行。
- 经验总结:以后写代码尽量别把 a++ 这种自增运算和逻辑运算符混在一起用,太容易出bug了
【第三部分:Switch 语句与 Case 穿透】
- 场景:练习把数字 1-7 转换成星期几。
- 代码实操:
intday=0;//switch练习一scanf_s("%d",&day);switch(day){case1:printf("星期一\n");break;case2:printf("星期二\n");break;case3:printf("星期三\n");break;case4:printf("星期四\n");break;case5:printf("星期五\n");break;case6:printf("星期六\n");break;case7:printf("星期天\n");break;}intday=6;switch(day){case1:case2:case3:case4:case5:printf("早八人,早八魂\n");break;// 运行到这里跳出case6:case7:printf("周末!关掉闹钟,爽睡11点\n");break;default:// 处理输入错误的情况printf("输入错误,请输入1到7的数字\n");break;}- 我的感悟:switch 里的 break 非常关键。如果没有 break,满足条件的 case 下面的代码都会被执行(这就是 case 穿透)。default 和 if-else 里的 else 一样,处理所有不符合的情况。
【第四部分:拓展练习(石头剪刀布)】
今天还写了一个简单的石头剪刀布逻辑:
charplayer='s';//石头剪刀布charcomputer='j';//if (player == computer)//{printf("平局!再来一局\n");}elseif((player=='s'&&computer=='j')||(player=='j'&&computer=='b')||(player=='b'&&computer=='s'))//这里一开始忘记用()把这个代码括起来了,导致了错误{printf("你赢了\n");}else{printf("你输了\n");}教训:逻辑嵌套一多,括号必须加,千万别盲目相信自己的优先级记忆。
第五部分:if else的练习
1.今天跟着老师写的练习,并且还将题目与输入输出结合了起来
inthas_key=0;inthp=0;intis_cursed=0;scanf_s("%d%d%d",&has_key,&hp,&is_cursed);//原题是没有输入函数的if((has_key>=1&&hp>=30)||is_cursed>=1){printf("开启隐藏房间--诅咒之屋\n");}else{printf("前方的门打不开\n");}
教训:记住if后面的括号后面不需要打分号
【总结】
今天的分支结构练得很爽。尤其是弄懂了“短路求值”,感觉自己对计算机的底层逻辑又明白了一点。明天准备进攻循环语句(for/while),继续加油!