我被"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(?
循环运行 n
到 1
次(不是条件> 0
(,例如
在第一个示例中,当您调用 power(3,2);
时,循环运行 n
= 2
到 1
。同样,在函数的第二次调用中,循环power(5,7);
运行 n
= 7
到 1
。
为什么我们在这里需要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 = 1
。 n
已作为函数参数之一提供,并用作计数器。 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