while(true)
显然可以创建一个“无限”循环,这只是意味着进程内部没有任何东西能够导致循环终止。操作系统仍然有可能决定(例如在 CPU 使用配额用完之后)或被要求(例如kill -HUP processid
在 UNIX/Linux 上)终止进程。
值得考虑包含以下内容的无限循环之间的区别:
- 阻塞 (I/O?) 请求,例如等待新的网络客户端连接或数据或键盘输入,甚至只是等待特定的时间间隔过去,然后是有限数量的周期性或 I/O 相关处理,以及
- 非阻塞分支和数据处理指令,只是围绕着燃烧 CPU 和/或颠簸 CPU/内存缓存(例如
x += array[random(array.size())];
)
前一种情况实际上可能在某些情况下被故意使用,例如不需要执行任何有序关闭的服务器进程,因此可以让操作系统在不运行任何后循环代码的情况下将其关闭,但第二种情况通常是编程错误:只有while(true)
在循环控制的处理过程中出现退出条件或错误以中断循环时,才会出现这样的错误。例如,可能有一个if (condition) break;
, 或者在出现错误时会抛出异常的东西。这可能并不明显 - 例如,如果可能是某个被调用函数的异常 - 即使将标准 iostream 的函数设置为在转换失败或 EOF 时抛出 - 而不是throw
循环内源代码中的可见语句。
值得注意的是,许多其他事情也可以创建无限循环——例如while (a < b)
,如果没有条件a
可以成为>= b
. 因此,您必须考虑循环如何退出,而不是语言的安全性问题,这是编程的一个普遍方面。对于输入,通常执行以下操作:
while (std::cin >> my_int)
{
// can use my_int...
}
// failed to convert next input from stdin to an int and/or hit EOF