V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ha2ha
V2EX  ›  程序员

一个++x 的疑问

  •  
  •   ha2ha · 2021-12-03 15:03:19 +08:00 · 2975 次点击
    这是一个创建于 1090 天前的主题,其中的信息可能已经有所发展或是发生改变。
    int x=5;
    int y=(++x)+(++x)+(++x);
    为什么在 c++里面是 22 ,而在 java 里面是 21 ;
    28 条回复    2021-12-04 00:33:38 +08:00
    thevita
        1
    thevita  
       2021-12-03 15:20:11 +08:00
    啥 c++

    天王老子来了也是 21
    power100
        2
    power100  
       2021-12-03 15:33:39 +08:00
    vc2022 的结果是 24 ,跟编译器有关,有兴趣可以看下汇编,日常代码一般也不会这么写。
    yuzo555
        3
    yuzo555  
       2021-12-03 15:37:17 +08:00
    梦回大一
    geekfxxk
        4
    geekfxxk  
       2021-12-03 15:40:41 +08:00   ❤️ 5
    这个要问谭浩强
    gaodq
        5
    gaodq  
       2021-12-03 15:46:23 +08:00
    c++标准未定义的行为
    constexpr
        6
    constexpr  
       2021-12-03 15:51:05 +08:00   ❤️ 1
    g++给出 warning: operation on 'x' may be undefined

    c/c++中, 在同一个表达式中即访问又改变变量是未定义行为. 而 java 的好像是标准有定义的.
    yinanc
        7
    yinanc  
       2021-12-03 15:53:06 +08:00   ❤️ 1
    梦回谭浩强
    constexpr
        8
    constexpr  
       2021-12-03 15:53:59 +08:00
    @constexpr 补充一下, g++给出结果是 22, clang 给出结果是 21,另外 clang 给出 warning: multiple unsequenced modifications to 'x' .
    mxT52CRuqR6o5
        9
    mxT52CRuqR6o5  
       2021-12-03 15:55:55 +08:00
    shintendo
        10
    shintendo  
       2021-12-03 15:56:01 +08:00   ❤️ 1
    标准未定义行为。未定义的意思就是编译器怎么结算都对,没有标准答案,不用在这种问题浪费时间,不要这样写代码,如果这是考试题那祝你好运。
    deplivesb
        11
    deplivesb  
       2021-12-03 15:57:39 +08:00
    这种 ub 有啥意思
    icyalala
        12
    icyalala  
       2021-12-03 15:58:47 +08:00   ❤️ 1
    这种日经贴...
    如果不管 UB 非要看结果的话, godbolt 上 MSVC 是 24, Clang 和 ICC 是 21, GCC 是 22
    raycool
        13
    raycool  
       2021-12-03 16:33:44 +08:00
    纠结这个没意义
    梦回谭浩强
    mxT52CRuqR6o5
        14
    mxT52CRuqR6o5  
       2021-12-03 16:38:58 +08:00
    js 把好多 C 语言中的 ub 给规定出标准来得到确定的行为,估计是方便用户优化
    (不去规范 ub 可能会导致不同的 js jit 引擎使用不同的方案优化)
    Jooooooooo
        15
    Jooooooooo  
       2021-12-03 16:40:39 +08:00
    不要学这个, 讲这种东西的书也不要再学了. 时间花在更好的地方.

    就算这是一个合法的行为, 你代码也不应该这么写. 这种题目, 让人得知原来代码还能这么写, 害人不浅.
    ayase252
        16
    ayase252  
       2021-12-03 16:48:25 +08:00 via iPhone   ❤️ 4
    建议标准规定这样写的语义是格式化硬盘
    xz410236056
        17
    xz410236056  
       2021-12-03 17:09:13 +08:00
    不同编译器 不同 C++有可能不一样,你别在这整谭浩强 那种不符合规范的代码,毫无意义
    joshu
        18
    joshu  
       2021-12-03 17:10:15 +08:00
    未指明的行为( unspecified behavior )——程序的行为随实现而变动,且遵从标准的实现不需要为每个行为的效果提供文档。例如求值顺序,等同的字符串字面量是否为不同的对象,数组分配的开销,等等。每个未指明行为均产生合法结果集合中的一个结果。
    https://zh.cppreference.com/w/cpp/language/eval_order
    Mirage09
        19
    Mirage09  
       2021-12-03 17:17:00 +08:00
    Don’t waste your time on such bs
    binfun
        20
    binfun  
       2021-12-03 17:31:53 +08:00
    我也有个疑问:
    a += ++b+++++c++
    anxxv2
        21
    anxxv2  
       2021-12-03 17:32:16 +08:00 via iPhone
    22 是咋来的?
    Leonard
        22
    Leonard  
       2021-12-03 17:36:03 +08:00
    有些地方尽喜欢考这种垃圾写法的题
    cclin
        23
    cclin  
       2021-12-03 18:45:04 +08:00 via Android
    @anxxv2 2*7+8
    mainjzb
        24
    mainjzb  
       2021-12-03 18:52:21 +08:00   ❤️ 1
    所以 go 禁止++嵌套写法
    Croxx
        25
    Croxx  
       2021-12-03 20:05:07 +08:00 via iPhone
    讲道理你敢写这样的代码,老板就敢给你开掉。
    smdbh
        26
    smdbh  
       2021-12-03 20:18:06 +08:00   ❤️ 1
    又搞回字
    AdminNB
        27
    AdminNB  
       2021-12-03 21:49:17 +08:00
    未定义行为( UB )
    Zien
        28
    Zien  
       2021-12-04 00:33:38 +08:00 via iPhone
    谭浩强 孔乙己 为让人内耗而设计的无意义
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1016 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 21:14 · PVG 05:14 · LAX 13:14 · JFK 16:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.