返回信息流Initialize integer i as 0, what's the value of i after the following operation?
i += i>0?i++:i--
a. -2
b. -1
c. 0
d. 1
e. 2
分析:
简化为 : i+=(i--);
拆解为:
P1: i += 0;
P2: i--;
是否可以认为,虽然副作用的结算顺序是未定义的,但无论结算顺序如何,结果都为-1?
又或者,由于顺序是未定义的,编译器可以以任意的方式来优化,所以结果是未知的?
这是一条镜像帖。来源:北邮人论坛 / cpp / #74261同步于 2013/10/7
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
[问题]副作用结算顺序对此题的影响
iam19891211
2013/10/7镜像同步16 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
"副作用"我是指平常说的"side effect",如果我们理解有偏差,那就算了。
如果你知道我指的是"side effect",那么麻烦解释一下说”此题没有副作用“的原因?
http://publications.gbdirect.co.uk/c_book/chapter2/expressions_and_arithmetic.html
The problem can be caused by using an assignment, use of the increment or decrement operators, or by calling a function that changes the value of an external variable that is also used in the expression. These are generally known as ‘side effects’. C makes almost no promise that side effects will occur in a predictable order within a single expression. (The discussion of ‘sequence points’ in Chapter 8 will be of interest if you care about this.)
【 在 YouXia 的大作中提到: 】
: 此题没有副作用。
额,关于”+=表达式不产生副作用“(我能这么理解你的话么)有什么参考么?
因为我理解的一切赋值语句都是产生副作用的。参见我回复沙发的内容。
【 在 gaoweiwei 的大作中提到: 】
: 计算顺序不同的实现可能不一样,不过结果都是一样的。跟 = 不一样,在这个+=表达式里计算顺序不一样不算side effect。
纠结这种题有啥意思?
http://en.wikipedia.org/wiki/%3F:#C
As in the if-else construct only one of the expressions 'x' and 'y' are evaluated.
每次看到此类类似问题就头大,个人认为过于追究语言细节问题完全是本末倒置。
可能是水平有限,我总觉得代码的功能正确和易读性是最重要的,并非每个程序员都需要了解一门语言的细枝末节,算法和实现过程才是要了解的重点。
我相信如果让C++或是其它语言的标准制定者来出题,他们能写出一大堆让人不知所云的诡异代码让你来判断执行结果。
汇编我当然看过,vs和gcc进行了相似的处理。
问题的根源在于:汇编只是具体某一个编译器的实现,编译器的厂商有权在标准限定的范围内进行任意的优化。
“汇编层面是一切语言理解问题的终结”这句话不全对。
【 在 ltmit 的大作中提到: 】
: 这个问题,强烈建议lz自己写下代码,跟一下汇编。
: 汇编层面是一切语言理解问题的终结。
问题不是“?:”表达式会计算哪边。只计算一边我还是知道的。
PS:因为这是微软的校园招聘题目,十分想探讨出一个比较合理的答案。
【 在 iFadeToBlack 的大作中提到: 】
: 纠结这种题有啥意思?
: http://en.wikipedia.org/wiki/%3F:#C
: As in the if-else construct only one of the expressions 'x' and 'y' are evaluated.