任何人都可以帮助我理解这段代码的输出吗?
#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
答案 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,相当于false
或true
。
注意:
虽然C语言允许各种疯狂的东西,但你不应该像在原始代码中那样编写for循环。事实上的标准就是写这样的循环:
不符合上述行业标准规则的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
递增。
x
和y
的初始值均为1
。
由于y
为1
,for
循环条件的计算结果为true
,并且for
循环块中的语句已执行。但是在代码的for
循环中,代替循环迭代器更新语句,您有printf()
语句,该语句在执行循环体后打印x
和y
的值声明。流程如下:
1 <= 5
评估为分配到1
的{{1}},此后y
为x
,
输出:2 1
2
评估为分配到2 <= 5
的{{1}},此后1
为y
,
输出:3 1
x
评估为分配到3
的{{1}},此后3 <= 5
为1
,
输出:4 1
y
评估为分配到x
的{{1}},此后4
为4 <= 5
,
输出:5 1
1
评估为分配到y
的{{1}},此后x
为5
,
输出:6 1
5 <= 5
评估为分配到1
的{{1}},此后y
为x
,
输出:7 0
现在值6
为6 <= 5
,在您的代码中,0
循环条件为y
,因此循环条件的计算结果为x
,循环退出