【发布时间】:2019-01-15 14:03:52
【问题描述】:
我刚才注意到下面的代码可以用clang/gcc/clang++/g++编译,使用c99、c11、c++11标准。
int main(void) {
int i = i;
}
即使使用-Wall -Wextra,编译器也没有报告警告。
通过将代码修改为int i = i + 1; 和-Wall,他们可能会报告:
why.c:2:13: warning: variable 'i' is uninitialized when used within its own initialization [-Wuninitialized]
int i = i + 1;
~ ^
1 warning generated.
我的问题:
- 为什么编译器甚至允许这样做?
- C/C++ 标准对此有何评论?具体来说,这是什么行为? UB 还是依赖于实现?
【问题讨论】:
-
-Wall -Wextra中没有任何“偶数”。这大约是警告中的最低限度。请参阅我的this answer 以了解有关-Wall的较早问题... -
重复:Why does the compiler allow initializing a variable with itself?。但是,那里的答案不是很好。所以让我们暂时把它打开,看看是否有更好的事情出现。然后我们可以关闭链接的帖子。
-
我改进了标题并将清除一些旧的、糟糕的重复,因为到目前为止发布的答案已经比针对欺骗问题发布的更好。
-
C++部分是stackoverflow.com/q/14935722/5376789的副本
标签: c++ c initialization language-lawyer