我坚持使用“C编程语言”一书中的这一行代码 - “ for(p = 1; n> 0; --n)” - 计数器从1运行到1以上,而步长为-1。但柜台是什么? n本身?
(我曾经看过 for(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;
}
答案 0 :(得分:1)
for
循环中的初始化表示p = 1
,而非n = 1
。 n
已作为函数参数之一提供,并用作计数器。 p
是结果的累加器。
更清楚地写这个可能是:
int p = 1;
while (n--) { p *= base; }
return p;
这里的道德是函数参数已经是局部变量,并且不需要为了它而创建重复的局部变量。修改函数参数非常好。
答案 1 :(得分:1)
在每次迭代中n
因1
而递减--n
,n
减少到0
条件n > 0
变为false并且循环中断。
for (p = 1; n > 0; --n)
^
| When n = 0, condition becomes 0 > 0 that is false
在循环中,您乘以p = p * base;
评估 => base * base * base * ...n times
=> base n 。
p
用于存储结果p = base n 。
你可能喜欢写它(一个小代码,我觉得有点快):
int p;
for (p = 1; n-- && (p*=base) ;)
return p;
修改评论&答案:
计数器启动时
for (p = 1; n > 0; --n)
-
是n
是计数器,在for循环中我们不需要初始化n
。我们只是使用p
初始化1
变量来存储结果。 n
的值来自函数参数。你可以将你的int power(int base, int n);
函数称为main中的某个位置,例如:
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
中最初1
,但在每次迭代中,您将p
乘以base
值,并将结果仅存储回p
。例如
对于函数调用power(3,2);
循环运行,p
计算如下:
base = 3,n = 2 p = 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
即3 2 = 9
。
答案 2 :(得分:0)
简短而简单:
int power(int base, int n)
那是你得到n
的地方,它是一个参数,
int p;
for (p = 1; n > 0; --n)
p
用作总和,计算结果,它不用于计算循环步骤,我们可以像这样重写这两行:
int p = 1;
for(; n > 0; --n)
从这里可以看出p
不会影响周期计数器
for(; n > 0; --n)
现在你应该明白,当n
大于0
这是循环的条件时循环运行,一旦这个陈述变为false
,循环将停止,并且每一步n
递减,因此循环将运行n
次。
p = p * base;
如您所见p
仅用于计算基数的功效(方法计算base^n
的多少),结果存储在p