在这种情况下 for 循环如何运行?

时间:2021-03-23 09:15:23

标签: c function for-loop static

#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())是做什么的吗?

3 个答案:

答案 0 :(得分: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());
    }
}

执行是这样的

               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"

答案 1 :(得分:0)

C for 循环包含 3 个项目:

  • 初始化

  • 条件

  • 增量

for 循环运行直到条件等于 0 或 null。

您进入循环,它在初始化时第一次调用 f1(),因此 val 等于 10

在每次迭代中,它将调用 f1() 三次,以检查条件、执行增量部分和 printf 调用。因此,在每次迭代中,我们有 val = val - 3

一旦 val == 0 退出循环。

请注意,它仅起作用,因为 val 是静态的,因此不会在每次调用 f1() 时重新初始化

答案 2 :(得分:0)

为了更容易理解,我将讨论这样的函数:

for (A(); B(); C()) {
    printf("%d", D());
}

所以理解所有 A B C 和 D 都是对 f1() 的调用,但我希望能够区分它们。

首先要了解的是 for 的“参数”是如何工作的。

  • 第一个是初始化部分,它只会在第一个条件评估之前执行一次。
  • 第二个是条件部分,它会在每次循环之前执行,以检查是否需要继续循环或停止。
  • 第三个是结论部分,它将在每次循环之后,在下一次条件评估之前执行。

然后我们可以理解您的程序将按以下顺序执行:

  • 调用 A() 来初始化 for 循环 => val = 10;
  • 调用 B() 检查条件 => val = 9
  • 在 printf => val = 8 中调用 D() 打印
  • 调用 C() 结束迭代 => val = 7
  • 调用 B() 检查条件 => val = 6
  • 在 printf => val = 5 中调用 D() 打印
  • 调用 C() 结束迭代 => val = 4
  • 调用 B() 检查条件 => val = 3
  • 在 printf => val = 2 中调用 D() 打印
  • 调用 C() 结束迭代 => val = 1
  • 调用 B() 检查条件 => val = 0 条件结束