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

2022-08-31 15:53:14

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

C/C++、C# 和 Java 在 post 和 pre increment 运算符方面到底有什么区别?

这就是我从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 |
+-----+-----+------+------+----+

答案 1

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

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


答案 2

我没有时间详细描述C++,C,C#和Java之间的差异。我只想说,前增量和后增量运算符的 C# 行为是完全指定的(在单线程方案中;如果你想知道它的原子性,保证在多处理器弱内存模型中观察读写顺序等等,你可以自己做研究。它在C和C++中没有完全指定;编译器具有广泛的特性,可以随心所欲地做它喜欢的,并具有重新排序的副作用。我从未使用过Java,所以我不会冒险猜测Java是做什么的。

有关 C# 用途的更多信息,应阅读 C# 规范。有关它的简短介绍,请阅读我对此问题的回答:

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

更短的拍摄时间:

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

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


推荐