一个++x 的疑问 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
ha2ha
V2EX    程序员

一个++x 的疑问

  •  
  •   ha2ha 2021-12-03 15:03:19 +08:00 3441 次点击
    这是一个创建于 1458 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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
    NVDA
        19
    NVDA  
       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 是咋来的?
    img src="https://cdn.v2ex.com/avatar/4174/e6b0/89202_normal.png?m=1648864294" class="avatar" border="0" align="default" alt="Leonard" data-uid="89202" />
        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     Solana     5255 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 05:48 PVG 13:48 LAX 21:48 JFK 00:48
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86