int i;
while(i=10)
{
printf("%d\n",i);
i=i+1;
}
有一个程序,其中while(i = 10)表示while(1)[通常]表示while循环是真的。因此它应该只打印10次并将i的值递增1,即i变为11。但输出是无限次打印'10'。为什么会这样? 我的平台是:64位Windows 7并使用32位Dev C ++编译器。
答案 0 :(得分:8)
我认为你想在while条件中使用double equal(比较)而不是单个equal(赋值)。您还应该将变量i初始化为10(否则永远不会执行while块)。
int i=10;
while (i==10)
{
printf("%d\n",i);
i=i+1;
}
答案 1 :(得分:5)
参见while循环,
while(i=10) // assigns the value 10 to the i which is always true (becuase any non-zero value is true in such a case).
您使用的是assignment operator
=
,因此此作业返回的值是rvalue
的值,10
且10
始终为真正。
这就是无限循环的原因。
你应该在循环中使用while(i == 10)
或while(i < = 10)
或任何比较运算符。
比较运算符结果为1
(true)或0
(false)。当在while(cond)
cond
中时,false循环终止。
答案 2 :(得分:2)
while(i=10)
将i
设置为10
,然后对其进行检查,即将其转换为true
或false
。只有0
为false
,因此每次都会变为true
,因此会永远循环。
我想你想要while(i==10)
。双=
表示&#34;检查相等&#34;。单=
表示&#34;设置值&#34;。
编辑:事实上,我并不确定你想要什么。如果你在循环之前没有初始化i
,那么也许你的意思是将它设置在条件中。在这种情况下,为什么每次都设置为10
时会感到惊讶?
再次修改:好的,所以通过评论,您执行意味着将其设置为条件。所以你需要了解这种情况是如何运作的。你写的是有效的:
while ( (bool)(i=10) )
这会将i
设置为10
,然后将10
转换为bool
,true
始终为i
。然后在循环中,11
增加到i
。然后当它回到循环的顶部时,会立即将10
设置回set i to 10; <-----\
print i (=> 10); |
set i to 11; |
go back to the top; /
。所以你有效地做了:
{{1}}
答案 3 :(得分:2)
在您的“条件”部分中,您要将值分配给i
而不是进行比较
while(i=10)
当程序成功编译时,很难跟踪此类错误。 为避免此类错误,请在反向顺序
中进行比较 while(10==i) or if(10==x
)等..
如果您错误地使用while(10=i)
,编译器将抛出类似
The left-hand side of an assignment must be a variable, property or indexer
以后节省宝贵的时间调试。
答案 4 :(得分:1)
我认为你缺少的关键是条件语句是执行循环的每次迭代。因此,对于循环的每次迭代,执行i=10
(并且针对零测试结果参考),而不仅仅是第一次迭代。
您的代码与此相同:
int i;
int j = (i=10);
while(j)
{
printf("%d\n",i);
i=i+1;
j = (i=10);
}
j = (i=10);
等同于i = 10; j = i;
。
步骤变为:
10
分配给i
,并将结果引用中的值(i
)分配给j
(分配按惯例返回引用或指针)。
printf
i
10
分配给i
,并将结果引用(i
)中的值分配给j
。
如果从赋值返回的值为零,则测试赋值的while循环只能失败/停止循环。
实际上,编写这样的循环是不好的方式,因为它们看起来太过类似于非常常见的while(i==10)
等式检查。有时,在使用对象时会测试赋值的返回值,例如while(nextObjPtr = collection.getNextObj())
,因为只要getNextObj
返回空指针,它就会失败。然而,即便如此,也会更明确地书写:
while((nextObjPtr = collection.getNextObj()) != nullptr)
或预C ++ 11:
while((nextObjPtr = collection.getNextObj()) != NULL)
答案 5 :(得分:0)
while(i=10)
条件错了! 实际上这不是一个条件!
你应该写
while(i<10)