V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
3dwelcome
V2EX  ›  问与答

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

  •  
  •   3dwelcome · 2016-03-18 16:31:15 +08:00 · 2948 次点击
    这是一个创建于 3175 天前的主题,其中的信息可能已经有所发展或是发生改变。

    int a=a+3;

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

    8 条回复    2016-07-20 11:08:15 +08:00
    mind3x
        1
    mind3x  
       2016-03-18 17:55:29 +08:00
    表示不信,求完整代码。
    3dwelcome
        2
    3dwelcome  
    OP
       2016-03-18 18:14:15 +08:00
    完全代码就是
    int main() {
    int a = a + 3;
    return 0;
    }

    调试运行,某些 vc 版本 a 的值会乱,某些 vc 版本会 crash ,行为并不一样。
    yksoft1
        3
    yksoft1  
       2016-03-18 19:39:51 +08:00
    @3dwelcome debug 和 release 模式的 CRT 的内存分配部分有点区别
    SoloCompany
        4
    SoloCompany  
       2016-03-18 21:03:09 +08:00 via iPad
    a 不是应该在堆栈中分配的吗,想不明白为什么会存在越界访问,预期结果不应该只是个不确定值吗
    bluecubic
        5
    bluecubic  
       2016-03-18 21:17:36 +08:00 via iPhone
    没有 crash 可能是因为编译器已经优化掉了这句因为没有进一步操作 a ,但是为什么这句本身会导致崩溃了表示不理解
    adadada
        6
    adadada  
       2016-03-19 02:21:08 +08:00
    因为在 C++ 标准中使用未初始化变量是 undefined behavior 而不是错。你可以试试把 warning level 提到 4 或者更高,这样编译器会报个 warning 。
    bluecubic
        7
    bluecubic  
       2016-03-19 11:53:09 +08:00 via iPhone
    @adadada 即使能产生报警结果不过是个不确定值 a ,导致崩溃多半是地址出错,或者错误操作堆栈.要想深究还得查编译后的汇编代码.
    rushcheyo
        8
    rushcheyo  
       2016-07-20 11:08:15 +08:00
    Clang 也允许,结果为不确定值。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5490 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 08:11 · PVG 16:11 · LAX 00:11 · JFK 03:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.