C语言初学日记:While/For循环实战与一场“分号引发的血案”
今天正式进攻C语言的循环结构(while 和 for)!我不仅练习了基础的循环打印、数字提取,还模拟了一个“打Boss”的小游戏。期间踩了一个极其隐蔽的坑,分享出来让大家避避雷
【第一部分:While 循环与数字提取】
- 知识点:while 循环适合不知道具体循环次数,只知道终止条件的场景。
- 代码实操:输入一个正整数,把它的每一位数字逆序打印出来(比如输入 123,打印 3 2 1)
unsignedintn=0;scanf_s("%u",&n);while(n){printf("%d ",n%10);// 拿到最后一位数字n/=10;// 去掉最后一位数字}- 我的理解:n % 10 是取余数,能剥出最后一位;n /= 10 是整除,能把最后一位砍掉。这个过程非常像在拆解数字。用 while(n) 作为条件,只要 n 不是 0 就会一直拆。
【第二部分:高光时刻,用 While 写个“打Boss模拟器”】
- 场景:假设Boss有 1000 血,我每次攻击 150 点。如果最后一击伤害溢出了怎么办?
- 代码实操:
intboss_hp=1000;intattack=150;while(boss_hp>0){// 三目运算符:如果血量大于攻击力,就造成150点;如果血量见底,就只造成剩余血量。intreal_attack=(boss_hp>attack)?attack:boss_hp;printf("你对boss造成了%d点伤害\n",real_attack);boss_hp-=real_attack;printf("boss还剩%d的血量\n",boss_hp);}printf("boss已被打败!掉落了传说装备\n");- 我的理解:这是今天写得最有意思的代码。不仅练了循环,还复习了昨天学的三目运算符 ? :,完美解决了最后一击伤害溢出的问题。
【第三部分:血泪踩坑!一场“分号引发的血案”】
- 题目:求 1 到 100 之间,所有 3 的倍数之和。
- 错误代码:
inti=0,sum=0;for(i=1;i<=100;i++){if(i%3==0);// <--- 致命错误:这里多写了一个分号!{sum+=i;}}printf("%d",sum);3.正确代码:将if语句后面的‘;’给删除即可,难怪打的两个个代码的结果不一样
- 踩坑原因:因为 if 后面不小心加了分号,导致这个 if 语句直接结束了。不管 i 是不是 3 的倍数,后面的 sum += i; 都会无脑执行。最后算出来的根本不是 3 的倍数之和,而是 1 加到 100 的总和!
- 经验教训:写代码时,if、while、for 后面如果带条件判断,千万不要顺手敲个分号!这个 Bug 找了我好久,肉眼根本看不出来。
【第四部分:逗号表达式与复利计算小练习】
今天还学了逗号表达式:
inta=1,b=2;intc=(b=4,a=b+10,b=a+1);// 从左向右执行,c的结果是最后一个表达式的值还写了一个银行复利的计算(年利率 3%,算5年):
doublemomny=10000;// 拼写错误,应该是money,被室友嘲笑了for(intyear=1;year<=5;year++){momny*=1.03;printf("第%d年:%.2f元\n",year,momny);}【总结】
今天练得非常充实!while 和 for 的逻辑基本搞清楚了。发现循环配合条件判断非常强大,但也极其容易写出死循环或者逻辑漏洞(比如分号坑)。
明天准备继续学习循环,将今天剩下的循环知识学习完,并且希望我之后能将正确率提高,继续加油吧!