在C,C ++,Java和C#中增加和增加运算符行为
这个问题在这里已经有了答案:
Java和C#从左到右评估表达式,并且副作用立即可见。
在C ++中,子表达式的评估顺序是未指定的,并且修改同一个对象两次而没有中间顺序点是未定义的行为。
我没有时间详细描述C ++,C,C#和Java之间的区别。 我只会说,前后增量运算符的C#行为是完全指定的 (在单线程场景中;如果您想知道其原子性,保证在多处理器弱存储器模型中读取和写入命令的观察结果,以及等等,你自己做这项研究。)它在C和C ++中没有完全指定; 编译器具有广泛的重要性,可以随意重新排序副作用。 我从来没有使用过Java,所以我不会猜测Java是做什么的。
有关C#的更多信息,您应该阅读C#规范。 对于这个问题,请阅读我对这个问题的回答:
i ++和++ i有什么区别?
对于更短的采取:
C#表达式中的子表达式按照优先级和关联性进行逻辑分组,然后从左向右评估,无论如何。 (例如,A()+ B()* C()评估A(),然后B(),然后C()。乘法“加在加法之前”的事实是不相关的;子表达式总是被评估左到右。)
如果子表达式的评估由于前或后增量子表达式而导致副作用,那么在产生结果之前立即发生副作用。
在C ++中,这是未定义的行为,所以任何答案都是正确的。 有关更多详细信息,请参阅未定义的行为和顺序点。
不确定其他语言,但我希望这里的代码也不正确。
编辑:
请参阅Eric Lippert关于C#的回答。 他反驳了我对C#行为的假设。
上一篇: Pre & post increment operator behavior in C, C++, Java, & C#