为什么输出是无限的?

时间:2012-12-04 09:52:16

标签: c++ c loops while-loop infinite-loop

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 ++编译器。

6 个答案:

答案 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的值,1010始终为真正。

这就是无限循环的原因。

你应该在循环中使用while(i == 10)while(i < = 10)或任何比较运算符。

比较运算符结果为1(true)或0(false)。当在while(cond) cond中时,false循环终止。

答案 2 :(得分:2)

while(i=10)i设置为10,然后对其进行检查,即将其转换为truefalse。只有0false,因此每次都会变为true,因此会永远循环。

我想你想要while(i==10)。双=表示&#34;检查相等&#34;。单=表示&#34;设置值&#34;。

编辑:事实上,我并不确定你想要什么。如果你在循环之前没有初始化i,那么也许你的意思是将它设置在条件中。在这种情况下,为什么每次都设置为10时会感到惊讶?

再次修改:好的,所以通过评论,您执行意味着将其设置为条件。所以你需要了解这种情况是如何运作的。你写的是有效的:

while ( (bool)(i=10) )

这会将i设置为10,然后将10转换为booltrue始终为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;

步骤变为:

  1. 10分配给i,并将结果引用中的值(i)分配给j(分配按惯例返回引用或指针)。
  2. 如果值为true(它总是如此),则执行循环块
    1. 致电printf
    2. 增量i
    3. 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)