如果发生硬件故障,哪个更有可能失败:( int i = 0; i != n; ++i ) 或 ( int i = 0; i < n; ++i )?

Which is more likely to fail in the event of a hardware failure: ( int i = 0; i != n; ++i ) or ( int i = 0; i < n; ++i )?

显然,

for ( int i = 0; i != n; ++i )

的工作原理相同
for ( int i = 0; i < n; ++i )

但是开发者对前者感到不安正常吗?我总是害怕一些奇怪的意外会使前一个循环中的 i "miss" 成为 n。然而,在第二个循环中,如果 i 以某种方式停止正确递增,那么 < 运算符将充当障碍。

这让我今天想到了一个问题,即考虑到各种各样的异常事故,哪个实际上更有可能失败。了解 compiler/hardware 知识的人可能会为我解答。

我很同情你,因为我开始编程时也有同样的感受。这只是您也必须习惯的东西。这两种方法都有时间和地点。例如,如果您使用的是 c++ 标准库,请使用第一种方法:

for (std::vector<int>::iterator it = myvector.begin() ; it != myvector.end(); ++it)

如果你只是循环固定次数,惯例是使用第二种方法:

for (unsigned int i = 0; i < N, i++)

不要浪费时间担心硬件问题。那是别人的工作。

我认为更喜欢 < 选项(我一直使用)的原因不是为了防止硬件故障(这是不可行的,因为根据定义,所有赌注都是关闭的,除非您正在编写非常特殊的内核/固件代码)但是防止出现逻辑错误(并且出于某些基本的人类本能原因而不是出于逻辑原因而感到更安全)。

防止在循环内修改循环计数器的错误类型。

相反的论点是,任何将 i 更改为 > n 的代码都可能是错误的(除非这是有人强制退出循环的方式 - 恕我直言,这是个坏主意),因此您应该允许循环 运行 离开数组的末尾并失败(假设你在一个检测数组末尾访问的平台上,Java,c#,...)。