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++ 编译器。
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++ 编译器。
我认为您想在 while 条件中使用双等号(比较)而不是单等号(赋值)。您还应该将变量 i 初始化为 10(否则将永远不会执行 while 块)。
int i=10;
while (i==10)
{
printf("%d\n",i);
i=i+1;
}
在 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 循环中使用while(i == 10)
orwhile(i < = 10)
或任何比较运算符。
比较运算符的结果为1
(true) 或0
(false)。当 inwhile(cond)
cond
为 false 时,循环终止。
在您的 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
节省以后调试的宝贵时间。
while(i=10)
设置i
为10
,然后检查它,即将它转换为true
or false
。Only 0
would be false
,所以true
每次都会这样,因此永远循环。
我猜你想要while(i==10)
。Double=
表示“检查相等性”。单一=
的意思是“设定值”。
编辑:事实上我不确定你想要什么。如果您没有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; /
我认为您缺少的关键是条件语句在循环的每次迭代中都会执行。对于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)
while(i=10)
条件不对!其实不是条件!
你应该写
while(i<10)