【发布时间】:2015-12-07 00:31:27
【问题描述】:
我有以下代码:
#include <iostream>
#include <complex>
using namespace std;
int main() {
complex<int> delta;
complex<int> mc[4] = {0};
for(int di = 0; di < 4; di++, delta = mc[di]) {
cout << di << endl;
}
return 0;
}
我希望它输出“0, 1, 2, 3”并停止,但它会输出无穷无尽的“0, 1, 2, 3, 4, 5, .....”系列
看起来比较 di<4 效果不好,总是返回 true。
如果我只是注释掉,delta=mc[di],我会正常得到“0、1、2、3”。无辜的分配有什么问题?
我正在使用带有 -O2 选项的 Ideone.com g++ C++14。
【问题讨论】:
-
我已经用 g++ 试过了,没有优化它工作正常。使用 -O3 它给出了 OP 提到的行为。使用 -O1 就可以了。
-
由于this case等未定义行为,听起来像是激进的循环优化
-
虽然代码确实调用了未定义的行为,但优化相当激进,据我观察,gcc 无法始终为此优化提供警告并没有帮助。
-
@Shafik Yaghmour GCC 不提供
cout << di警告的原因可能是复杂的流插入运算符将di的地址传递给一些“不透明”代码(或complex 的流插入运算符本身是不透明的——尽管这会让我感到惊讶)。并且根据“不透明”代码的作用,程序的行为仍然可以很好地定义。我并不是说如果没有太多误报(甚至任何误报),在这种情况下就不可能提供警告。只是这会很困难。 -
@ShafikYaghmour 我正在使用带有 -O2 选项的 Ideone.com g++ C++14。 (谢谢,我在我的问题中添加了它。)
标签: c++ gcc undefined-behavior