在C,C ++,Java和C#中增加和增加运算符行为

这个问题在这里已经有了答案:

  • 为什么这些构造(使用++)在C中的未定义行为? 13个答案
  • 未定义的行为和序列点4个答案
  • 如何在复杂表达式中评估Java增量语句1回答
  • C#前后增量混淆6个答案

  • 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#行为的假设。

    链接地址: http://www.djcxy.com/p/73223.html

    上一篇: Pre & post increment operator behavior in C, C++, Java, & C#

    下一篇: What made i = i++ + 1; legal in C++17?