0

我被“C 编程语言”一书中的这行代码所困扰 - “ for (p = 1; n > 0; --n) ” - 计数器从 1 运行到大于 1,而 step 是 -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; 
   }
4

3 回答 3

1

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

更清晰的写法可能是:

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

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

于 2013-07-18T09:19:47.563 回答
1

在每次迭代中,由于n减少,当减少到条件变为假并且循环中断时。1--nn0n > 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 => base n

pis 用于在末尾存储结果 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)?

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

为什么我们需要 p ?

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

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

基数 = 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  

返回p3 2 = 9

于 2013-07-18T09:19:57.930 回答
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)

现在你应该明白了,循环运行whilen大于0循环的条件,一旦这个语句变成false,循环将停止,并且每一步n递减,所以循环将运行n次数。

p = p * base;

正如您在此处看到的,p仅用于计算 base 的幂(方法计算多少是base^n),结果存储在p

于 2013-07-18T14:04:11.530 回答