为什么输出是无限的?
Why the output is infinite?
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
,然后对其进行检查,即将其转换为true
或false
。只有0
才会false
,所以每次都变得true
,因此永远循环。
我猜你想要while(i==10)
.双=
的意思是"检查相等"。单个=
表示"设置值"。
编辑:事实上,我不太确定你想要什么。如果您没有在循环之前初始化i
,那么也许您确实想在条件中设置它。在这种情况下,为什么您每次都惊讶于它都设置为10
?
再次编辑:好的,所以通过您的评论,您确实打算将其设置为条件。因此,您需要了解该条件的工作原理。你写的实际上是这样的:
while ( (bool)(i=10) )
这会将i
设置为10
,然后将10
转换为始终true
的bool
。然后在循环中,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;
。
因此,步骤变为:
- 将
10
赋值给i
,并将结果引用中的值(i
)赋值分配给j
(赋值按照惯例返回引用或指针)。 - 如果值为 true(始终为 true),则执行循环块
- 呼叫
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)
- 递归函数计算序列中的平方和(并输出过程)
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 请解释"函数1(p1,p2,p3);"的输出
- C++:将控制台输出存储在宏中更好吗
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 在控制台上输出我从文件中读取的整数,将程序插入无限循环
- 当我在循环内打印变量时无限输出
- 为什么输出会进入无限循环
- 我的c ++数组值不想改变,它输出无限循环
- 为什么当用户输入除整数之外的任何内容时,我的程序会无限循环输出?C++
- 我写了一个函数来删除循环链接列表中的第 1 个节点,但输出显示无限次"55 44 33 22 11 99",那么我该如何解决呢?
- 为什么输出是无限的?
- C++ - 无限输出到控制台
- C++ 无限循环读取文件创建重定向命令输出
- 无限循环heisenbug:如果我添加打印输出,它就会退出
- 为什么我的 while 循环会导致无限输出
- 统计计算器输出无限循环
- 为什么这段代码没有给出任何输出?这似乎是一个无限循环
- 读取文本文件获得奇怪的值,获得无限的值输出
- 无法弄清楚为什么这个输出格式化循环是无限的