免责声明: 这不是一个真实的例子.这只是这些语言如何运作的理论问题.
在发布和预增量运算符方面,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++中,子表达式的评估顺序是未指定的,并且在没有插入序列点的情况下两次修改同一对象是未定义的行为.
Eri*_*ert 33
我没有时间写出C++,C,C#和Java之间差异的详细描述.我只会说前置和后置增量运算符的C#行为是完全指定的(在单线程场景中;如果你想知道它的原子性,保证在多处理器弱内存模型中观察读写顺序和所以,你可以自己做这项研究.)它没有在C和C++中完全指定; 编译器具有广泛的优势,可以通过重新排序副作用来做任何事情.我从来没有使用过Java,所以我不会猜测Java的作用.
有关C#的更多信息,您应该阅读C#规范.简而言之,请阅读我对这个问题的回答:
为了更短的时间:
C#表达式中的Subexpressions按优先级和关联性进行逻辑分组,然后从左到右进行评估,无论如何.(例如,A()+ B()*C()计算A(),然后计算B(),然后计算C().乘法"在之前"加法的事实是无关紧要的;子表达式总是被评估左到右.)
如果子表达式的评估由于前或后增量子表达而导致副作用,则副作用在结果产生之前立即发生.
归档时间: |
|
查看次数: |
15459 次 |
最近记录: |