[问题]递增运算子的考题

楼主: blueblueChen (蓝蓝欠)   2018-08-25 09:55:42
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 才对吧..?
作者: ggBird (ggBird)   2018-08-25 10:05:00
ub
作者: Schottky (顺风相送)   2018-08-25 10:12:00
undefined behavior,出考题的是谁,叫他不用来上班了置底十三戒之第八戒,这不是你的问题,考题不能这样出
作者: moebear (萌熊)   2018-08-25 10:14:00
作者: eye5002003 (下一夜)   2018-08-25 10:41:00
我有写过这样的考题,一个老工程师出的
作者: chuegou (chuegou)   2018-08-25 11:43:00
r1=i++; r2=++i; i=r1+r2; 我猜啦如果硬要知道为什么是22 反组译看组语如何?
作者: stupid0319 (征女友)   2018-08-25 12:52:00
何必浪费生命在智障的问题上
作者: sarafciel (Cattuz)   2018-08-25 13:27:00
未定义指的是"标准"未定义C的标准没有定义 i++ + ++i 时三个算子的执行顺序所以编译器在编这行的时候就是随编译器高兴的意思编是一定可以编过 只是你换个编译器结果就不一样子BTW 出这考题的是智障 不要理他
楼主: blueblueChen (蓝蓝欠)   2018-08-25 18:47:00
那为何 x=x++叫做未定义 *p++ 就不是?
作者: jerryh001   2018-08-25 19:02:00
因为*p++明确知道怎么做
作者: as7218 (Kaigiks)   2018-08-25 22:14:00
楼主: blueblueChen (蓝蓝欠)   2018-08-25 22:20:00
我有看jserv的 blogC 语言没规定 i++ 或 ++i 的“加 1”动作到底是在何时时刻执行,所以说 printf("%d\n",a++); 也会不知道 [+1] 是在何时进行的吗? 但从以前的经验来看都是先印出,再[+1]
作者: AstralBrain   2018-08-25 22:33:00
对, 不知道印出来的值是"a++"这个expression的传回值不是a当下的值
作者: sarafciel (Cattuz)   2018-08-25 23:26:00
靠XD 翻了一下标准 如果我的破英文没有影响理解的话+1执行的时间点在99以前没定 11以后是有定的XDDD详情见C11标准6.5.2.4 不过这篇问的东西还是UB就是了
作者: oToToT (屁孩)   2018-08-26 14:41:00
总之,没事不要这样写最保险,可读性有够低

Links booklink

Contact Us: admin [ a t ] ucptt.com