C:帮我理解输出

时间:2018-01-08 14:21:00

标签: c output

任何人都可以帮助我理解这段代码的输出吗?

#include <stdio.h>

int main()
{
    int x = 1, y = 1;

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

    return 0;
}

输出是:

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

7 个答案:

答案 0 :(得分:5)

形式的for循环
for (a; b; c)
{
    d;
}

相当于

{
    a;

    while (b)
    {
        d;

        c;
    }
}

现在,如果我们采取你的循环

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

相当于

{
    // Nothing

    // Loop while y is non-zero
    while (y)
    {
        // Check if x is less than or equal to 5, assign that result to y
        // Then increase x by one
        y = x++ <= 5;

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

现在应该更容易理解正在发生的事情。

另外:请记住,对于布尔结果(就像比较结果得到的那样),true等于1,false等于0

答案 1 :(得分:2)

代码是一个混淆,丑陋的版本:

#include <stdio.h>
#include <stdbool.h>

int main()
{
    int x = 1;
    bool y = true;

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

    return 0;
}
原始代码中的

y用作布尔值。在古代,C中没有布尔类型,因此通常使用int代替。表达式y = x++ <= 5;的计算结果为0或1,相当于falsetrue

注意:

虽然C语言允许各种疯狂的东西,但你不应该像在原始代码中那样编写for循环。事实上的标准就是写这样的循环:

  • for循环的第一个子句只包含迭代器初始化。
  • 第二个子句应该只包含循环条件。
  • 第三个子句应该只包含循环迭代器的更改,例如增量(如i ++)。

不符合上述行业标准规则的for循环写得很糟糕,没有任何借口。

答案 2 :(得分:1)

for循环的第一个组件是空的;这意味着变量的值没有改变。 for循环中的条件是y。这意味着循环将一直运行直到条件y为真;这意味着直到y的值不是0。 当y的值等于0时;条件将变为false,循环将停止迭代。

然后是块执行......

y = x++ <= 5;

首先检查条件x <= 5。请注意,x ++是后增量,因此在执行语句之后,x的值将增加。所以,如果x的值在增量之前是1;它会在执行声明后检查1 <= 5而不是2 <= 5;该值将变为2。

之后是for循环的第三个组成部分,它是增量部分。在这里,

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

只需打印x和y。

那么,会发生什么;当循环开始时,x和y都是1。

声明

y = x++ <= 5;
遇到

,因此检查条件x++ <= 5,其中x为1.由于条件为真; y的值将为1,x将递增为2.同样的事情继续......当x等于5时,x++ <= 5将检查5 <= 5,条件将为真, x将增加到6.现在它在下一次进入循环时;条件将为false,而y将等于0.因此,现在当循环检查条件y时,条件将为false,因此控件将流出循环,因此您将看到结果。

答案 3 :(得分:0)

如果y = x++ <= 5;小于或等于y,则1语句会将x设置为5,如果0,则设置为x 1}}大于5。然后它会递增x。当y等于0时,即在x增加到5之后的迭代中,循环停止。然后它在每次迭代时运行printf()语句。

通常情况下,您不会看到循环切换循环条件和循环体。这似乎是一个在技术上合法的病态例子。你不应该模仿它。

答案 4 :(得分:0)

y为1(真),只要x <= 5且x每次迭代都增加。

重写您的代码:

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

或使用while

int x = 1;
int y = 1;

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

答案 5 :(得分:0)

我在IDA中构建并转储了此代码,因为我更好地理解了汇编:D 这段代码有点混淆,所以这里将是它的正常版本:

#include <stdio.h>
int x = 1;
int y = 1;
while(y != 0) {
    if(x++ <= 5)
    {
      y = 1;
    } else {
      y = 0;
    }

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

来源中的for循环:

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

检查y是否为非零值,如果是,则会打印出您想要的字符串。在循环体中,比较结果(0或1)将被复制到y并继续检查。

答案 6 :(得分:0)

运算符<=的优先级高于运算符=。 声明:

y = x++ <= 5;

相当于:

y = (x++ <= 5)

由于后期增加++运算符,x的值首先返回,然后x递增。

xy的初始值均为1

由于y1for循环条件的计算结果为true,并且for循环块中的语句已执行。但是在代码的for循环中,代替循环迭代器更新语句,您有printf()语句,该语句在执行循环体后打印xy的值声明。流程如下:

1 <= 5评估为分配到1的{​​{1}},此后yx

输出:2 1

2评估为分配到2 <= 5的{​​{1}},此后1y

输出:3 1

x评估为分配到3的{​​{1}},此后3 <= 51

输出:4 1

y评估为分配到x的{​​{1}},此后44 <= 5

输出:5 1

1评估为分配到y的{​​{1}},此后x5

输出:6 1

5 <= 5评估为分配到1的{​​{1}},此后yx

输出:7 0

现在值66 <= 5,在您的代码中,0循环条件为y,因此循环条件的计算结果为x,循环退出