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

4

6 回答 6

8

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

int i=10;
while (i==10)
{
    printf("%d\n",i);
    i=i+1;
}
于 2012-12-04T10:04:07.000 回答
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 循环中使用while(i == 10)orwhile(i < = 10)或任何比较运算符。

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

于 2012-12-04T09:53:51.703 回答
2

在您的 while 条件部分中,您正在分配值i而不是进行比较

 while(i=10)

当程序编译成功时,这种类型的错误很难跟踪。为避免此类错误,请按相反顺序进行比较

while(10==i) or if(10==x) ETC..

万一你误用while(10=i)了,编译器会抛出类似的错误

The left-hand side of an assignment must be a variable, property or indexer

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

于 2012-12-04T10:17:19.440 回答
2

while(i=10)设置i10,然后检查它,即将它转换为trueor false。Only 0would be false,所以true每次都会这样,因此永远循环。

我猜你想要while(i==10)。Double=表示“检查相等性”。单一=的意思是“设定值”。

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

再次编辑:好的,所以通过您的评论,您意思是在条件中设置它。所以你需要了解这种情况是如何运作的。你写的实际上是这样的:

while ( (bool)(i=10) )

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

set i to 10; <-----\
print i (=> 10);    |
set i to 11;        |
go back to the top; /
于 2012-12-04T09:54:16.623 回答
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. 分配10i,并将结果引用 ( i) 中的值分配给j(分配按约定返回引用或指针)。
  2. 如果值为真(总是如此),则执行循环块
    1. 称呼printf
    2. 增量i
    3. 分配10i,并将结果引用 ( i) 中的值分配给j

如果从分配返回的值为零,则测试分配的 while 循环只能失败/停止循环。

实际上,像这样编写循环是不好的风格,因为它们看起来与非常常见的while(i==10)相等检查太相似了。有时在使用对象时会测试赋值的返回值,例如while(nextObjPtr = collection.getNextObj()),因为一旦getNextObj返回空指针就会失败。然而,即使这样,也会更清楚地写出:

while((nextObjPtr = collection.getNextObj()) != nullptr)

或 C++11 之前的版本:

while((nextObjPtr = collection.getNextObj()) != NULL)
于 2012-12-04T10:08:16.267 回答
0
  while(i=10)

条件不对!其实不是条件!

你应该写

while(i<10)
于 2012-12-04T09:54:40.117 回答