可能的重复:
main 返回什么?
例如,以下代码编译时不会出现任何警告:
#include <stdio.h>
int i = i + 1;
int main(int argc, char *argv[])
{
fprintf (stderr, "%d\n", i);
return 0;
}
我认为这在语法上是非法的,因为i
在声明之前就使用了,对吗?
而在我看来,外观int i = i + 1;
肯定是一个错误,为什么编译器不警告它?我使用海湾合作委员会4.5.1。
(注意:我指的是当前的C++标准)
我对此不太确定,但是,如果我对标准的解释是正确的,那么代码应该没问题,而不是 UB。
该变量的第一次初始化是零初始化发生的具有静态存储持续时间的对象在任何其他之前
发生初始化(第 3.6.2 节 ¶1)。
所以,首先i
被设置为零。
Then, 动态初始化(即非零和非常量初始化)发生,因此它使用当前值i
(0) 再次实际初始化它。最后它应该评估为 1。
这似乎已被 §8.5 ¶6 证实,明确指出:
任何静态存储持续时间的对象占用的内存应在程序启动时在任何其他初始化发生之前进行零初始化。[注意:在某些情况下,稍后会进行额外的初始化。 ]
(如果您在分析中发现一些缺陷,请在评论中告诉我,我很乐意纠正/删除答案,地板很滑,我意识到了:))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)