为什么输出是无限的?

Why the output is infinite?

本文关键字:无限 输出 为什么      更新时间:2023-10-16
int i;
while(i=10)
{
printf("%dn",i);
i=i+1;
}

有一个程序,其中 while(i=10) 表示 while(1)[通常] 表示 while 循环为真。因此,它应该只打印 10 一次并将 i 的值递增 1,即 i 变为 11.但输出是无限重复打印"10"。为什么会这样? 我的平台是:64位Windows 7,并在32位开发C++编译器上工作。

我认为您想在 while 条件中使用双等(比较)而不是单等(赋值)。您还应该将变量 i 初始化为 10(否则 while 块将永远不会被执行)。

int i=10;
while (i==10)
{
printf("%dn",i);
i=i+1;
}

see in while loop ,

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 循环中使用while(i == 10)while(i < = 10)或任何比较运算符。

比较运算符结果为1(真) 或0(假)。当while(cond)cond是假循环终止时。

在 while 条件部分,您正在为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

节省以后调试的宝贵时间。

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

我猜你想要while(i==10).双=的意思是"检查相等"。单个=表示"设置值"。

编辑:事实上,我不太确定你想要什么。如果您没有在循环之前初始化i,那么也许您确实想在条件中设置它。在这种情况下,为什么您每次都惊讶于它都设置为10

再次编辑:好的,所以通过您的评论,您确实打算将其设置为条件。因此,您需要了解该条件的工作原理。你写的实际上是这样的:

while ( (bool)(i=10) )

这会将i设置为10,然后将10转换为始终truebool。然后在循环中,i递增到11.然后,当它回到循环的顶部时,它会立即i设置回10。所以你正在有效地做:

set i to 10; <-----
print i (=> 10);    |
set i to 11;        |
go back to the top; /

我认为您缺少的关键是条件语句在循环的每次迭代中都执行。因此,对循环的每次迭代执行i=10(以及针对零测试生成的引用),而不仅仅是第一次迭代。

您的代码等效于以下内容:

int i;
int j = (i=10);
while(j)
{
printf("%dn",i);
i=i+1;
j = (i=10);
}

其中j = (i=10);等效于i = 10; j = i;

因此,步骤变为:

  1. 10赋值给i,并将结果引用中的值(i)赋值分配给j(赋值按照惯例返回引用或指针)。
  2. 如果值为 true(始终为 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)
while(i=10)

条件不对! 其实这不是一个条件!

你应该写

while(i<10)