以下函数被调用了多少次?

时间:2011-09-10 23:38:34

标签: c for-loop

我有一本书中的以下练习程序。该书指出,对于x = 10和y = 100的值,函数; min,max,incr和square分别称为1,91,90和90。然而,对我而言,它们被称为以下次数,1,1,1和0.有人可以向我解释书号。感谢。

#include <stdio.h>

int min(int x, int y){
    return x < y ? x : y;
}

int max(int x, int y){
    return x > y ? y : x;
}

void incr(int *xp, int v) {
    *xp += v;
}

int square (int x){
    return x*x;
}

int main(void){
    int i;
    int x = 10;
    int y = 100;
    int t = 0;

    for (i = min(x, y); i < max(x, y); incr(&i, 1)){
        t += square(i);
        printf("test %i", t);
    }
}

5 个答案:

答案 0 :(得分:1)

这实际上取决于编译器和优化设置。

使用-O3编译此程序(在修复max()函数以返回最大值之后)显示实际上没有调用任何函数。编译器可以看到循环从10变为100,并且变量增加1。

永远不要假设调用函数。您告诉编译器您希望程序执行什么操作,但编译器可以选择以任何方式执行此操作。

顺便说一下,在没有修复max()的情况下,编译器可以看到这是一个空循环,并生成一个main()函数,它只返回而不设置任何变量或做任何事情(再次,使用 - O3)。

答案 1 :(得分:0)

感觉像家庭作业所以我不想提供完整的解决方案,但这里有一个提示......关键在于理解在每次循环迭代结束时评估(调用)max,因为max的结果可以在每次循环迭代后改变。

只要i小于给定循环迭代的max(x,y),循环就会继续。

答案 2 :(得分:0)

在for循环中,有3个部分,初始化,继续条件,增量。

for(initialization; continue condition; increment) {
    body;
}

循环执行此操作:

  1. 做初始化部分
  2. 检查继续条件(如果为真则退出)
  3. 执行for循环体
  4. 中的代码
  5. 执行增量条件
  6. 回到2
  7. 因此,如果我们遍历它,则调用min一次(初始化),直到满足条件,每次调用max(继续条件)。这将从i = 10到i = y发生,这是91次(开始时一次,每次迭代一次)。

    对于每次迭代,增量部分只调用一次,但最初不调用,因此它将被调用90次(100 - 10)。

    方形函数将发生与调用增量相同的次数(因为它在增量之前调用,但每次迭代调用一次)。

答案 3 :(得分:0)

每次循环评估for循环中的后两个表达式。每次运行第二个表达式以检查循环是否应该继续,最后一个表达式用于更改循环的状态。例如:

for (int x = 0; x < 100; ++x) { /* ... */ }

x&lt;每次循环都要评估100表达式,看看你是否改变了它。 ++x每次都需要进行评估,因为它正在递增x

for (expression 1; expression 2; expression 3)循环实际上只是常见模式的捷径:

{
    expression 1;
    if (expression 2)
    {
        do //Do-while + if to demonstrate how `break` and `continue` affect things
        {
            //loop body
            expression 3;
        }
        while(expression 2)
    }
}

答案 4 :(得分:0)

这个循环真的是(因为x和y不会改变):

for (i = 10; i < 100; incr(&i, 1))

第一个语句只执行一次 - 这就是min执行1次的原因。 停止条件在开始时执行一次,然后在每次迭代后执行 - 因此执行91次。第三个statemnt在每次迭代结束时执行 - 所以90次。

所以这本书是正确的。