You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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):

  1. n=3>0 → p=1*2=2,n=2
  2. n=2>0 → p=2*2=4,n=1
  3. n=1>0 → p=4*2=8,n=0
  4. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 10:20:31