我有一本书中的以下练习程序。该书指出,对于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);
}
}
答案 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;
}
循环执行此操作:
因此,如果我们遍历它,则调用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次。
所以这本书是正确的。