为了账号安全,请及时绑定邮箱和手机立即绑定

C,C ++,Java和C#中的前后增量运算符行为

C,C ++,Java和C#中的前后增量运算符行为

慕容708150 2019-07-26 16:52:38
C,C ++,Java和C#中的前后增量运算符行为在发布和预增量运算符方面,C / C ++,C#和Java之间究竟有什么区别?这就是我用VC ++ 10,Java 1.6和C#4获得的int a = 2;int b = a++ + a++;int c = ++a + a++ + a++;      +-----+------+------+----+      |  C  | C++  | Java | C# |+-----+-----+------+------+----+| a   |  7  |  7   |   7  |  7 |+-----+-----+------+------+----+| b   |  4  |  4   |   5  | 5  |+-----+-----+------+------+----+| c   | 15  |  15  |  16  | 16 |+-----+-----+------+------+----+
查看完整描述

3 回答

?
温温酱

TA贡献1752条经验 获得超4个赞

我没有时间写出C ++,C,C#和Java之间差异的详细描述。我只会说前置和后置增量运算符的C#行为是完全指定的(在单线程场景中;如果你想知道它的原子性,保证在多处理器弱内存模型中观察读写顺序和所以,你可以自己做这项研究。)它没有在C和C ++中完全指定; 编译器具有广泛的优势,可以通过重新排序副作用来做任何事情。我从来没有使用过Java,所以我不会猜测Java的作用。

有关C#的更多信息,您应该阅读C#规范。简而言之,请阅读我对这个问题的回答:

i ++和++ i有什么区别?

为了更短的时间:

C#表达式中的Subexpressions按优先级和关联性进行逻辑分组,然后从左到右进行评估,无论如何。(例如,A()+ B()* C()计算A(),然后计算B(),然后计算C()。乘法“在之前”加法的事实是无关紧要的;子表达式总是被评估左到右。)

如果子表达式的评估由于前或后增量子表达而导致副作用,那么副作用会结果产生之前立即发生。


查看完整回答
反对 回复 2019-07-26
?
慕田峪9158850

TA贡献1794条经验 获得超7个赞

在C ++中至少有这种未定义的行为。引用C ++标准:

在前一个和下一个序列点之间,标量对象应通过表达式的计算最多修改其存储值一次。


查看完整回答
反对 回复 2019-07-26
  • 3 回答
  • 0 关注
  • 527 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信