为何添加printf("*")后递归代码输出正常,无该语句则无输出?
为什么添加printf("*")后才会输出数字?
核心原因:两个关键问题叠加
1. isPrime函数的致命未初始化错误
你的isPrime函数里的int p;没有初始化,这意味着p的初始值是栈上的随机垃圾值,直接导致素数判断完全混乱:
- 如果垃圾值
p >= n,循环直接跳过,函数错误地返回1(把任何n>=2都当成素数); - 如果垃圾值
p == 0,执行n%p会触发除零错误,程序直接崩溃; - 其他情况会随机判定素数,导致递归中
r的计算结果完全不可预测。
这种随机行为会让递归逻辑变得不稳定:有时候r会刚好满足n%2==1&&n>56的终止条件,有时候会陷入无限递归。
2. 标准输出的缓冲区机制
C语言中stdout默认是行缓冲:只有输出换行符\n、缓冲区被填满,或者程序正常终止时,才会把缓冲区里的内容刷新到终端。
- 当你没加
printf("*");时,如果程序陷入无限递归,永远不会走到main里的printf("%d", f(n));即使递归正常终止,因为输出没有换行符,缓冲区没被及时刷新,你也看不到任何输出; - 当你添加了
printf("*");后,每次递归都会往缓冲区里写一个*,当缓冲区被填满时会自动刷新,你能看到*的输出。同时,可能某次递归中r恰好满足终止条件,递归结束,main里的数字输出会随着程序终止被刷新到终端,所以你能看到*加数字的结果。
修复建议
- 给
isPrime里的p初始化:int p = 2;(素数判断应该从2开始遍历); - 如果想确保输出及时刷新,可以在
printf后加上fflush(stdout);,或者在输出末尾添加换行符\n; - 递归逻辑最好加兜底的终止条件(比如限制递归深度),避免因逻辑漏洞导致无限递归。
内容的提问来源于stack exchange,提问作者Muchacho
相关产品推荐
相关产品推荐

