前几天,我在一个C ++应用程序中遇到了一个奇怪的错字,该错字触发了代码进入无限循环。在for
循环的最后,程序员不小心分配了i++
,而不仅仅是递增i = i++
。
for (int i = 0; i < 10; i = i++) {
cout << "i = " << i << endl;
}
输出:
i = 0
i = 0
i = 0
...
最奇怪的部分是,即使理解这是一个错字,我也看不出为什么这段代码不起作用。据我所知,分配给i
不会有影响,因为分配后i
仍应增加。 (出于某种原因,它必须改为增加副本?这似乎没有任何意义。)
还要注意的另一件有趣的事情是将分配更改为i = ++i
不会产生无限循环。
此代码未在我们之前的编译器gcc version 4.4.7 20120313
上产生无限循环。我们最近升级到gcc version 4.8.5 20150623
,现在已经升级。
问题是,为什么这段代码在逻辑上看起来似乎不应该产生无限循环,并且哪个编译器根据C ++标准正确地解释了这一问题?
答案 0 :(得分:6)
i = i++
的行为是未定义的(在未排序的步骤中同时进行读写-标准中的是)。 从不使用。
请注意,i = ++i
是是从C ++ 11定义的。
关于编译器错误的思考。并非不可能,但是极其不太可能,特别是如果可疑的表情很小的话。