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

Nic*_*ick 57 c c# c++ java

免责声明: 这不是一个真实的例子.这只是这些语言如何运作的理论问题.

在发布和预增量运算符方面,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 |
+-----+-----+------+------+----+
Run Code Online (Sandbox Code Playgroud)

fre*_*low 63

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

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

  • @Nick:对于C,见[N1256](http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf)(PDF),第6.5节,第2段; 第6.5.2.4节,第2段.我目前无法达到C++标准,但语言基本相同. (10认同)
  • 确切地说,人们说它在C#和Java中未定义是完全错误的. (8认同)
  • @Nick:Java在[JLS§15.7"评估顺序"](http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.7)中指定了这一点:"Java编程语言保证运算符的操作数似乎是按照特定的评估顺序进行评估,即从左到右." (8认同)
  • 对于C++,它是ISO/IEC 14882:2003(E)§5,4. (2认同)

Eri*_*ert 33

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

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

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

为了更短的时间:

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

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

  • @configurator:我们在C#设计团队中有两个前Java语言人员,所以我认为我们已经涵盖了这一点.:-) (5认同)

归档时间:

查看次数:

15459 次

最近记录:

7 年,8 月 前