6

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

我真的无法弄清楚这个例子......

我知道将第一个参数留空会使它表现得像 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循环结构部分......

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

4

6 回答 6

15

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

循环的第一部分用于初始化。将此留空很好,它只是表明您已经初始化了循环所需的任何变量。

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

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

大多数教科书都会对此进行描述。或者参见Wikipediacplusplus

于 2013-05-08T19:17:31.433 回答
6

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

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

这将发生:

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

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

于 2013-05-08T19:18:36.323 回答
2

我早期发现的一个技巧是,如果我无法理解 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 值的结果。

于 2013-05-08T19:27:58.390 回答
0
 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.
于 2013-05-08T19:27:30.330 回答
0

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

于 2013-05-08T19:18:22.350 回答
0

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

于 2013-05-08T19:34:16.473 回答