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

我对上面代码片段中 for 构造的结构感到困惑。它取自一本关于 C 编程的书。

根据本书,正确的输出如下。

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

有人可以解释这是输出的方式和原因吗?

4

3 回答 3

2

如果你扩展它,这个结构就会变得很容易理解。我认为这里的诀窍在于理解 x 的后缀递增发生在比较之后。

您的示例中显示的另一个概念是,在 C 中,所有比较都返回一个布尔值(1 表示真,0 表示假)。

#include <stdio.h>
int main()
{
    int x = 1, y = 1;

    printf("first version:\n");
    for(;y;printf("%d%d\n",x,y))
        y = x++ <= 5;
    printf("second version:\n");
    x = 1;
    y = 1;

    while (y != 0)
     {
        if (x <= 5)
          y = 1;
        else
          y = 0;
        x = x + 1;
        printf ("%d%d\n",x,y);
     }
    return 0;
}

我希望这回答了你的问题。

于 2013-09-30T17:12:15.313 回答
2

要了解for循环的作用,这里是等效while循环:

while (y) {
    y = x++ <= 5;
    printf("%d%d\n",x,y);
}

转换是这样的:

for (INIT; COND; INC) {
  BODY;
}

->

INIT;
while (COND) {
  BODY;
  INC;
}

请注意,在 C 中,表达式y等价于y != 0if yis an int

于 2013-09-30T16:12:01.250 回答
1

总结一下 for 循环在 C 中的工作原理:

for(initialization; condition; expression) {
     //statements
}

1.在条件的第一次评估之前执行初始化 2.在循环的每次迭代之后评估表达式。3. 只有条件为真时才会进入循环。

在您的代码中,请注意在该行中,

y = x++ <= 5;

' x ' 与数字 5 在其值递增之前进行比较。例如,在第 5 次迭代中,检查 x=5 是否符合 (<=5),然后将其递增到 6。之后的语句

printf("%d%d\n",x,y)

执行打印“61”。

于 2013-09-30T16:58:58.230 回答