作者blueblueChen (蓝蓝欠)
看板C_and_CPP
标题递增运算子的考题
时间Sat Aug 25 09:55:42 2018
i = 10;
i = i++ + ++i;
i是多少
答案是 22
假设是三个变数就算了 c = a++ + ++b; 还可以理解。这是同个变数
最後会看起来是 10 + 11 = 21, 21再做後增的动作。
盲点是 ++i -> i = 11;
i++ -> 此时的 i 不应该是 11吗??
应该要出来 11 + 11 = 22,最後才做 22 後增动作 为 23 才对吧..?
------------------------------------------------------------------------------
刚参考了版友说 undefined behavior
其实我完全混乱了
1. linux gcc 可以过,表示它已定义的意思吗? 我要怎样才可以知道这是未定义的
2. x = x++; 在置底第八戒也说他是 undefined 的,这个很下意识的就是++最後做
赋值先做,最後才++,还是如果是 y = x++; 就不会有这困扰了?
------------------------------------------------------------------------------
请问 x = x++; 为何是未定义行为,而 *p++ 这种就不属於是未定义行为????
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 219.68.215.61
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1535162145.A.799.html
1F:→ ggBird: ub 08/25 10:05
2F:推 Schottky: undefined behavior,出考题的是谁,叫他不用来上班了 08/25 10:12
3F:→ Schottky: 置底十三戒之第八戒,这不是你的问题,考题不能这样出 08/25 10:14
※ 编辑: blueblueChen (219.68.215.61), 08/25/2018 10:41:41
5F:推 eye5002003: 我有写过这样的考题,一个老工程师出的 08/25 10:41
6F:→ chuegou: r1=i++; r2=++i; i=r1+r2; 我猜啦 08/25 11:43
7F:→ chuegou: 如果硬要知道为什麽是22 反组译看组语如何? 08/25 11:44
8F:推 stupid0319: 何必浪费生命在智障的问题上 08/25 12:52
9F:→ sarafciel: 未定义指的是"标准"未定义 08/25 13:27
10F:→ sarafciel: C的标准没有定义 i++ + ++i 时三个运算元的执行顺序 08/25 13:30
11F:→ sarafciel: 所以编译器在编这行的时候就是随编译器高兴的意思 08/25 13:31
12F:→ sarafciel: 编是一定可以编过 只是你换个编译器结果就不一样 08/25 13:32
13F:→ sarafciel: 子 08/25 13:32
14F:→ sarafciel: BTW 出这考题的是智障 不要理他 08/25 13:43
※ 编辑: blueblueChen (219.68.215.61), 08/25/2018 17:47:51
15F:→ blueblueChen: 那为何 x=x++叫做未定义 *p++ 就不是? 08/25 18:47
16F:推 jerryh001: 因为*p++明确知道怎麽做 08/25 19:02
18F:→ blueblueChen: 我有看jserv的 blog 08/25 22:20
19F:→ blueblueChen: C 语言没规定 i++ 或 ++i 的「加 1」动作到底是在 08/25 22:20
20F:→ blueblueChen: 何时时刻执行,所以说 printf("%d\n",a++); 也会不 08/25 22:21
21F:→ blueblueChen: 知道 [+1] 是在何时进行的吗? 但从以前的经验来看 08/25 22:22
22F:→ blueblueChen: 都是先印出,再[+1] 08/25 22:22
23F:推 AstralBrain: 对, 不知道 08/25 22:33
24F:→ AstralBrain: 印出来的值是"a++"这个expression的传回值 08/25 22:34
25F:→ AstralBrain: 不是a当下的值 08/25 22:35
26F:→ sarafciel: 靠XD 翻了一下标准 如果我的破英文没有影响理解的话 08/25 23:26
27F:→ sarafciel: +1执行的时间点在99以前没定 11以後是有定的XDDD 08/25 23:27
28F:→ sarafciel: 详情见C11标准6.5.2.4 不过这篇问的东西还是UB就是了 08/25 23:32
29F:→ oToToT: 总之,没事不要这样写最保险,可读性有够低 08/26 14:41