刚才我遇到了以下类型的错误:
#include <iostream>
const int i = i;
int main(void)
{
/* not allowed by default, but with -fpermissive */
//const int i;
/* allowed by default, even without -fpermissive. Seems to initialize to 0 */
for ( int j = 0; j < i; ++j )
std::cout << "hi";
/* i = 0 */
}
编译为:
g++ const-init.cpp -Wall -Wextra -pedantic -O2
因为编译器默默地将 i 初始化为 0,所以一些循环被优化掉了。该错误是由于复制粘贴错误而发生的。
这个“功能”是否有效和/或记录在某处?它到底有什么用呢?它有名字吗?
编辑:没有 -O2 g++ 的行为就像我希望它的行为一样:它会发出以下错误
const-init.cpp:8:19: warning: ‘i’ is used uninitialized in this function [-Wuninitialized]
const int i = i;
^
那么为什么编译器在使用时假设 i 为 0-O2
由于这个假设,标记甚至删除整个循环?
它的名字是“未定义的行为”和设置i
到 0 只是一种可能的结果。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)