为何C语言找零程序未陷入无限循环?
CS50找零程序循环逻辑解释
先明确你提到的找零程序的典型设计逻辑(CS50 Problem Set 1的标准实现思路):程序只会在剩余找零金额大于等于当前硬币面值时,才执行扣减该硬币并增加计数的操作,这是程序不会无限循环的核心原因。
以你说的change=4的情况为例:
- 程序会依次判断剩余金额是否满足25(quarter)、10(dime)、5(nickel)的面值条件,显然4都小于这些值,所以直接进入最后处理1分硬币(penny)的分支。
- 处理penny时,每次循环仅扣减1,同时计数加1:第一次循环后change=3,第二次2,第三次1,第四次0。当change变为0时,循环的终止条件(
change>0)不再满足,循环直接结束,最终计数为4,程序正常退出。
你之前的误解在于误以为程序会执行change - nickel的操作,但实际上else if (change >=5)这个条件在change=4时根本不成立,所以不会触发扣减5的逻辑。正常逻辑下,程序永远不会让剩余找零金额变成负数——因为只有当金额足够支付当前硬币时,才会执行扣减操作,这就保证了循环一定会在change归0时终止,不会陷入无限循环。
如果真写出“不管金额多少就扣减nickel”的错误代码,确实会出现无限循环,但CS50习题的正确逻辑不会这么设计。
内容的提问来源于stack exchange,提问作者VestoSlypher
相关产品推荐
相关产品推荐

