Pre&在C,C ++,Java和&amp ;;中增加运算符行为。 C#

时间:2011-06-23 16:03:22

标签: c# java c++ 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 |
+-----+-----+------+------+----+

6 个答案:

答案 0 :(得分:63)

Java和C#从左到右计算表达式,副作用立即可见

在C ++中,子表达式的评估顺序是未指定的,并且在没有插入序列点的情况下两次修改同一对象是未定义的行为。

答案 1 :(得分:33)

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

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

What is the difference between i++ and ++i?

更短暂的拍摄:

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

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

答案 2 :(得分:4)

在C ++中,这是未定义的行为,因此任何答案都是正确的。有关详细信息,请参阅Undefined behavior and sequence points

不确定其他语言,但我希望此代码也不正确。

编辑:
请参阅Eric Lippert关于C#的回答。他反驳了我对C#行为的假设。

答案 3 :(得分:4)

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

  

在上一个和下一个序列点之间,标量对象的表达式评估最多只能修改一次存储值。

答案 4 :(得分:1)

Java内存模型确保了加载和存储完成的顺序,因此它应该在任何JVM上都是相同的(我相信)。

它看起来像C ++ has the same order of operations,但是一旦你在一条线上使用它两次就开始遇到其他东西(Vlad就在那里)。如果您尝试其他C ++编译器,您可能会发现它们提出了不同的答案。

我确信C#具有相同的操作顺序,但我猜他们有一个内存模型(如Java)来确保一致性,但我在这里没有太多的知识。

答案 5 :(得分:1)

我喜欢这个问题并找到了很好的解释,但我只是想通过评估它的价值来解释这个问题:

我只会谈论java和c / C ++,因为我对C#

没有任何了解

语句按以下方式评估

在java中

声明||||||||||||||||||||||||||||||||||||||||||| ||||||||||||微量

int a= 2;                     a=2
int b= a++ + a++;             a=2, a=3

here value of a=4

int c = ++a + a++ + a++;      a=5, a=5, a=6

here value of a=7

在C / C ++中

声明追踪

int a= 2;                     a=2
int b= a++ + a++;             a=2, a=2

here value of a=4

int c = ++a + a++ + a++;      a=5, a=5, a=5

here value of a=7

简而言之,java表达式从左到右,所以在第二个“a”它将获取新值,在c / c ++中,它将首先计算整个表达式,然后递增语句的所有操作数。