【问题标题】: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 条件结束

      【讨论】:

        猜你喜欢
        • 2018-09-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-31
        • 2012-04-08
        • 1970-01-01
        • 2021-07-06
        相关资源
        最近更新 更多