为何K&R示例中power函数用--n正常,++n却运行出错?
为什么修改power函数的for循环增量会导致结果错误?
先看两段代码的核心差异:
正确版本(K&R示例)
#include <stdio.h> int power (int m, int n); int main() { int i; for (i = 0; i < 10; ++i) printf ("%d %d %d\n", i , power(2,i), power(-3,i)); return 0; } int power (int base, int n) { int p; for (p = 1; n > 0; --n) p = p * base; return p; }
错误版本(仅修改循环增量)
#include <stdio.h> int power (int m, int n); int main() { int i; for (i = 0; i < 10; ++i) printf ("%d %d %d\n", i , power(2,i), power(-3,i)); return 0; } int power (int base, int n) { int p; for (p = 1; n > 0; ++n) p = p * base; return p; }
问题根源:for循环的终止逻辑完全反转
正确版本的power函数逻辑清晰:
- 初始化
p=1(任何数的0次幂都是1) - 循环条件
n>0:只要还有剩余幂次需要计算,就继续执行循环体 - 每次循环后
--n:把剩余需要计算的幂次减1,直到n变为0,循环正常终止
比如计算power(2,3):
- n=3>0 → p=1*2=2,n=2
- n=2>0 → p=2*2=4,n=1
- n=1>0 → p=4*2=8,n=0
- n=0不满足条件,退出循环,返回8(正确的2^3)
而错误版本把--n改成++n后,循环的终止逻辑彻底被破坏:
- 当
n初始为正数(比如i=1时n=1),每次循环后n会持续增大,永远不会小于等于0,循环无限执行(直到整数溢出导致n变为负数,这属于C语言中的未定义行为) - 即使因溢出侥幸退出循环,此时
p已经被乘以base无数次,结果完全不是预期的base^n - 只有当
n=0时(比如i=0),两段代码行为一致,因为循环条件不满足,直接返回1
所以错误版本要么陷入无限循环卡死,要么输出完全错误的超大数值,而正确版本能正常终止循环并返回正确的幂次结果。
内容的提问来源于stack exchange,提问作者user23577853
相关产品推荐
相关产品推荐

