一个++x 的疑问

2021-12-03 15:03:19 +08:00
 ha2ha
int x=5;
int y=(++x)+(++x)+(++x);
为什么在 c++里面是 22 ,而在 java 里面是 21 ;
2778 次点击
所在节点    程序员
28 条回复
thevita
2021-12-03 15:20:11 +08:00
啥 c++

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

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

就算这是一个合法的行为, 你代码也不应该这么写. 这种题目, 让人得知原来代码还能这么写, 害人不浅.
ayase252
2021-12-03 16:48:25 +08:00
建议标准规定这样写的语义是格式化硬盘
xz410236056
2021-12-03 17:09:13 +08:00
不同编译器 不同 C++有可能不一样,你别在这整谭浩强 那种不符合规范的代码,毫无意义
joshu
2021-12-03 17:10:15 +08:00
未指明的行为( unspecified behavior )——程序的行为随实现而变动,且遵从标准的实现不需要为每个行为的效果提供文档。例如求值顺序,等同的字符串字面量是否为不同的对象,数组分配的开销,等等。每个未指明行为均产生合法结果集合中的一个结果。
https://zh.cppreference.com/w/cpp/language/eval_order
Mirage09
2021-12-03 17:17:00 +08:00
Don’t waste your time on such bs
binfun
2021-12-03 17:31:53 +08:00
我也有个疑问:
a += ++b+++++c++

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

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

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

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

© 2021 V2EX