脑洞大开,为什么 Microsoft Visual Studio C++会一直允许 int a=a+3;这种反人类的语法存在?

2016-03-18 16:31:15 +08:00
 3dwelcome

int a=a+3;

试了手头几个版本的 vc 编译, 有 vc2010, 编译时都很顺利通过,然后一运行,由于取不到 a 的地址(0 或者 0xcccccccc),马上就 crash ,好大的坑,微软也一直不去填,也是醉了。

2973 次点击
所在节点    问与答
8 条回复
mind3x
2016-03-18 17:55:29 +08:00
表示不信,求完整代码。
3dwelcome
2016-03-18 18:14:15 +08:00
完全代码就是
int main() {
int a = a + 3;
return 0;
}

调试运行,某些 vc 版本 a 的值会乱,某些 vc 版本会 crash ,行为并不一样。
yksoft1
2016-03-18 19:39:51 +08:00
@3dwelcome debug 和 release 模式的 CRT 的内存分配部分有点区别
SoloCompany
2016-03-18 21:03:09 +08:00
a 不是应该在堆栈中分配的吗,想不明白为什么会存在越界访问,预期结果不应该只是个不确定值吗
bluecubic
2016-03-18 21:17:36 +08:00
没有 crash 可能是因为编译器已经优化掉了这句因为没有进一步操作 a ,但是为什么这句本身会导致崩溃了表示不理解
adadada
2016-03-19 02:21:08 +08:00
因为在 C++ 标准中使用未初始化变量是 undefined behavior 而不是错。你可以试试把 warning level 提到 4 或者更高,这样编译器会报个 warning 。
bluecubic
2016-03-19 11:53:09 +08:00
@adadada 即使能产生报警结果不过是个不确定值 a ,导致崩溃多半是地址出错,或者错误操作堆栈.要想深究还得查编译后的汇编代码.
rushcheyo
2016-07-20 11:08:15 +08:00
Clang 也允许,结果为不确定值。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/264514

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX