【问题标题】:How does the for loop run in such a case?在这种情况下,for 循环如何运行?
【发布时间】:2021-06-19 22:27:58
【问题描述】:
#include <stdio.h>
int f1(){
static int val=11;
return --val;
}
int main()
{
for( f1(); f1(); f1()){
printf("%d",f1());
}
}
程序的输出是:
8 5 2
谁能解释一下for(f1();f1();f1()) 是做什么的?
【问题讨论】:
-
您的问题缺少信息:您预期会发生什么?你的期望与你得到的输出有何不同?请edit您的问题添加此信息。
标签:
c
function
for-loop
static
【解决方案1】:
C for 循环包含 3 项:
for 循环一直运行,直到条件等于 0 或 null。
你进入循环,它在初始化时第一次调用f1(),所以 val 等于 10
在每次迭代中,它将调用f1() 三次,以检查条件,执行增量部分和 printf 调用。因此,在每次迭代中,我们都有val = val - 3
一旦val == 0 退出循环。
请注意,它之所以有效,是因为 val 是静态的,因此不会在每次调用 f1() 时重新初始化
【解决方案2】:
#include <stdio.h>
int foo(void) {
static int val = 11;
return --val;
}
int main(void) {
int (*f1)(void) = foo; //4 function pointers to the same function
int (*f2)(void) = foo;
int (*f3)(void) = foo;
int (*f4)(void) = foo;
for (f1(); f2(); f3()) {
printf("%d", f4());
}
}
执行是这样的
值 = 11
f1() 10
f2() 9 “真”
f4() 打印 8
f3() 7
f2() 6 “真”
f4() 打印 5
f3() 4
f2() 3 “真”
f4() 打印 2
f3() 1
f2() 0 “假”
【解决方案3】:
为了更容易理解,我将讨论这样的函数:
for (A(); B(); C()) {
printf("%d", D());
}
所以请理解所有 A B C 和 D 都是对 f1() 的调用,但我希望能够区分它们。
要了解的第一件事是for 的“参数”是如何工作的。
- 第一个是初始化部分,它只会在第一个条件评估之前执行一次。
- 第二个是条件部分,它会在每次循环之前执行,检查是否需要继续循环或停止。
- 第三个是结论部分,它将在每个循环之后,在下一次条件评估之前执行。
那么我们就可以理解你的程序会按照这个顺序执行:
- 调用A()初始化for循环 => val = 10;
- 调用 B() 检查条件 => val = 9
- 在你的 printf 中调用 D() => val = 8 被打印出来
- 调用 C() 结束迭代 => val = 7
- 调用 B() 检查条件 => val = 6
- 在你的 printf 中调用 D() => val = 5 被打印出来
- 调用 C() 结束迭代 => val = 4
- 调用 B() 检查条件 => val = 3
- 在你的 printf 中调用 D() => val = 2 被打印出来
- 调用 C() 结束迭代 => val = 1
- 调用 B() 检查条件 => val = 0 条件结束