【问题标题】:For loop with printf as 3rd argument以 printf 作为第三个参数的循环
【发布时间】:2013-05-08 19:14:01
【问题描述】:

正在学习计算机科学的期末考试......

我实在想不通这个例子.....

我知道将第一个参数留空会使它表现得像 TRUE....

但我不明白在第二个参数中保留一个变量会完成什么......

我最不明白的是 printf 语句如何“更新”变量条件...

  #include<stdio.h>
  int main()
  {
    int x=1, y=1;
    for(; y; printf("%d %d\n", x, y))
    {
      y = x++ <= 5;
    }
    printf("\n");
    return 0;
  }

输出是:

2 1
3 1
4 1
5 1
6 1
7 0

编辑:

我现在明白了for循环结构部分.....

感谢您的回答 - 非常有见地的感谢!

【问题讨论】:

  • 声明“将第一个参数留空使其表现得像 TRUE”是不正确的。 for 循环的第二部分是条件,而不是第一部分。

标签: c for-loop


【解决方案1】:

for 循环可以被认为是for (INITIALIZATION; CONDITION; AFTERTHOUGHT)

循环的第一部分用于初始化。留空也没关系,它只是表明您已经初始化了循环所需的任何变量。

for 循环的第二个表达式(或条件)中的y 等价于y!=0。它使for 循环一直运行到y==0

事后的printf 在每次迭代结束时运行,但不会更改y 的值。然而,循环的主体确实发生了变化 y

大多数教科书都会对此进行描述。或查看Wikipediacplusplus

【讨论】:

    【解决方案2】:

    在 for 循环中考虑这个结构:

    for (a; b; c)
    {
        d;
    }
    

    这就是将会发生的事情:

    1. 将执行代码 a
    2. 将评估条件 b。如果为 false,则 for 循环中断。
    3. 代码 d 被执行。
    4. 代码 c 被执行。
    5. 转到第 2 步

    最后发生的事情是代码的“c”部分正在打印y 的值,而它恰好是0。然后评估条件。由于y == 0,for循环会中断,因为0等价于false

    【讨论】:

      【解决方案3】:

      我早期发现的一个技巧是,如果我无法理解 for 循环,请尝试将其分解为等效的 while 循环。您还可以对事物进行括号化以使其更具可读性(只要您遵循括号上的操作顺序以不搞砸评估。您的循环将如下所示:

      #include<stdio.h>
      int main()
      {
          int x=1, y=1;
          while(y)
          {
              y = (x++ <= 5);
              printf("%d %d\n", x, y)
          }
          printf("\n");
          return 0;
      }
      

      通过这些更改,很容易看出您的打印语句没有更改/更新任何内容,而只是打印您的 y 值的结果。

      【讨论】:

        【解决方案4】:

        这会运行程序直到 y 为 0,因为 0 作为整数也是 False

        【讨论】:

        • 尽量不要给出什么,他/她显然可以看到什么,他们想知道为什么。
        【解决方案5】:
         Leaving a variable y implies the loop will run till y is true
         loop will stop when y becomes false
        
         Now this condition that you have written in body evaluates value of y
         y = x++ <= 5;
        
         Whenever x++ <= 5 implies y is true that is 1 
         So it starts with x=1 and prints until value of x becomes 7
         and y=x++ <= 5; returns false and loop exits.
        

        【讨论】:

          【解决方案6】:

          虽然simonc提供的Answer很完美,但也有切实可行的解决方案。在 Visual Studio 中键入此程序,在 for 循环开始处添加断点并使用 F10 键运行每个语句。它会清楚地向您展示在执行时所采用的流程。这将有助于消除您的所有疑虑。也不要忘记密切关注变量的值,这将有助于进一步。 这就是帮助我解决大部分疑虑的原因。享受编码!

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-09-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-08-02
            • 1970-01-01
            相关资源
            最近更新 更多