在这种情况下,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"