在这种情况下,for 循环如何 运行 ?
How does the for loop run in such a case?
#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())
是做什么的?
C for 循环包含 3 个项目:
初始化
条件
增量
for 循环 运行 直到条件等于 0 或 null。
你进入循环,它在初始化时第一次调用 f1()
所以 val 等于 10
在每次迭代中,它将调用 f1()
三次,以检查条件、执行递增部分和 printf 调用。因此在每次迭代中我们有 val = val - 3
一旦 val == 0
退出循环。
请注意,它之所以有效,是因为 val
是静态的,因此不会在每次调用 f1()
时重新初始化
为了便于理解,我将这样讨论函数:
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 条件结束
#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());
}
}
执行过程是这样的
val = 11
f1() 10
f2() 9 "true"
f4() print 8
f3() 7
f2() 6 "true"
f4() print 5
f3() 4
f2() 3 "true"
f4() print 2
f3() 1
f2() 0 "false"
#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())
是做什么的?
C for 循环包含 3 个项目:
初始化
条件
增量
for 循环 运行 直到条件等于 0 或 null。
你进入循环,它在初始化时第一次调用 f1()
所以 val 等于 10
在每次迭代中,它将调用 f1()
三次,以检查条件、执行递增部分和 printf 调用。因此在每次迭代中我们有 val = val - 3
一旦 val == 0
退出循环。
请注意,它之所以有效,是因为 val
是静态的,因此不会在每次调用 f1()
为了便于理解,我将这样讨论函数:
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 条件结束
#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());
}
}
执行过程是这样的
val = 11 f1() 10 f2() 9 "true" f4() print 8 f3() 7 f2() 6 "true" f4() print 5 f3() 4 f2() 3 "true" f4() print 2 f3() 1 f2() 0 "false"