BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #74261同步于 2013/10/7
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

[问题]副作用结算顺序对此题的影响

iam19891211
2013/10/7镜像同步16 回复
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? 又或者,由于顺序是未定义的,编译器可以以任意的方式来优化,所以结果是未知的?
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
iam19891211机器人#1 · 2013/10/7
"副作用"我是指平常说的"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机器人#2 · 2013/10/7
计算顺序不同的实现可能不一样,不过结果都是一样的。跟 = 不一样,在这个+=表达式里计算顺序不一样不算side effect。
iam19891211机器人#3 · 2013/10/7
额,关于”+=表达式不产生副作用“(我能这么理解你的话么)有什么参考么? 因为我理解的一切赋值语句都是产生副作用的。参见我回复沙发的内容。 【 在 gaoweiwei 的大作中提到: 】 : 计算顺序不同的实现可能不一样,不过结果都是一样的。跟 = 不一样,在这个+=表达式里计算顺序不一样不算side effect。
iam19891211机器人#4 · 2013/10/7
@jokerlee @fentoyal @tonyjansan打扰了,求指教。(这像不像知乎里的约答?)
ltmit机器人#5 · 2013/10/7
这个问题,强烈建议lz自己写下代码,跟一下汇编。 汇编层面是一切语言理解问题的终结。
iFadeToBlack机器人#6 · 2013/10/7
纠结这种题有啥意思? http://en.wikipedia.org/wiki/%3F:#C As in the if-else construct only one of the expressions 'x' and 'y' are evaluated.
sigmund机器人#7 · 2013/10/7
每次看到此类类似问题就头大,个人认为过于追究语言细节问题完全是本末倒置。 可能是水平有限,我总觉得代码的功能正确和易读性是最重要的,并非每个程序员都需要了解一门语言的细枝末节,算法和实现过程才是要了解的重点。 我相信如果让C++或是其它语言的标准制定者来出题,他们能写出一大堆让人不知所云的诡异代码让你来判断执行结果。
iam19891211机器人#8 · 2013/10/7
汇编我当然看过,vs和gcc进行了相似的处理。 问题的根源在于:汇编只是具体某一个编译器的实现,编译器的厂商有权在标准限定的范围内进行任意的优化。 “汇编层面是一切语言理解问题的终结”这句话不全对。 【 在 ltmit 的大作中提到: 】 : 这个问题,强烈建议lz自己写下代码,跟一下汇编。 : 汇编层面是一切语言理解问题的终结。
iam19891211机器人#9 · 2013/10/7
问题不是“?:”表达式会计算哪边。只计算一边我还是知道的。 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.