书中的电源程序 "c program. lang." 版本 2,循环



我被"C Programming Language"一书中的这一行代码困住了 -">对于 (p = 1;n> 0;--n(" - 计数器从 1 运行到大于 1,而步长为 -1。但是什么是计数器?n本身?

(

我曾经看到过类似 (i = 1; i <= n; ++i( 的结构,所以计数器的问题很清楚,但是在版本 2 中我遇到了我真的不知道计数器是什么和在哪里......

从这里:

/* power:  raise base to n-th power; n >= 0; version 2 */
   int power(int base, int n)
   {
       int p;
       for (p = 1; n > 0; --n)
           p = p * base;
       return p; 
   }

在每次迭代中,n由于--n而递减1,当n减少到0条件时,n > 0变为假并循环中断。

for (p = 1; n > 0; --n)
              ^
              |  When n = 0, condition becomes 0 > 0 that is false

在循环中,您将乘以p = p * base;计算 => base * base * base * ...n times =>底数n

p 是用于在末尾存储结果 p = 基数n

你可能喜欢这样写(一个小代码,我认为也有点快(:

int p;
for (p = 1; n--  && (p*=base) ;)
return p;   

编辑:评论和答案:

for (p = 1; n > 0; --n) - 计数器何时启动?

是的,n是计数器,在 for 循环中我们不需要初始化n.我们只是用1初始化p变量来存储结果。n的值来自函数参数。你在主函数中调用你的int power(int base, int n);函数,比如:

result = power(3,2);  // here base = 3, and n = 2

result = power(5,7); // here base = 5, and n = 7

从 n 到 p(到 1(?

循环运行 n1 次(不是条件> 0(,例如
在第一个示例中,当您调用 power(3,2); 时,循环运行 n = 21 。同样,在函数的第二次调用中,循环power(5,7);运行 n = 71

为什么我们在这里需要p?

正如我在上面的回答中所写p我们需要存储结果。

在循环中p最初1,但在每次迭代中,您将p乘以base值并将结果存储回p
例如对于函数调用power(3,2);循环运行和p计算如下:

基数 = 3 , n = 2p = 1; 初始化

第一次迭代:

condition n > 0 is True because n is 2 (2 > 0). 
p = p * base = 1 * 3 = 3
and p becomes 3. 
Now --n decreases n to 1

第二次迭代:

condition n > 0 is True because n is 1 (1 > 0). 
p = p * base = 3 * 3 = 9
and p becomes 9. 
Now --n decreases n to 0

第三次迭代:

condition n > 0 is False because n is 0 (0 > 0).  
condition false so loop breaks  

返回p即 32 = 9

for循环中的初始化表示p = 1,而不是n = 1n已作为函数参数之一提供,并用作计数器。 p是结果的累加器。

更清晰的编写方法可能是:

int p = 1;
while (n--) { p *= base; }
return p;

这里的寓意是函数参数已经是局部变量,没有必要仅仅为了它而创建重复的局部变量。修改函数参数是完全可以的。

简短而简单:

int power(int base, int n)

这就是你得到n的地方,它作为一个参数出现,

int p;
for (p = 1; n > 0; --n)

p用作总和,来计算结果,它不用于计算循环步骤,我们可以像这样重写这 2 行:

int p = 1;
for(; n > 0; --n)

从这里可以明显看出p不会影响周期计数器

for(; n > 0; --n)

现在你应该明白,循环运行时n大于0这是循环的条件,一旦这个语句变得false,循环就会停止,并且在每一步n递减,所以循环会运行n次。

p = p * base;

正如你在这里看到的p仅用于计算基数的幂(方法计算base^n多少(,结果存储在p

最新更新