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

32 浏览
0 Comments

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

免责声明:这不是一个真实世界的例子,而只是一个关于这些编程语言如何工作的理论问题。\n在后增加和前增加运算符方面,C/C++、C#和Java之间有哪些区别?\n这是我在VC++10、Java 1.6和C# 4中得到的结果:\n

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 |
+-----+-----+------+------+----+

0
0 Comments

C、C++、Java和C#中的预增和后增运算符的行为是不同的。在C++中,这是未定义的行为,因此任何答案都是正确的。在其他语言中,这段代码应该是不正确的。在C#中,Eric Lippert的答案否定了我对C#行为的假设。我会说,任何答案都是不正确的。在另外两种语言中,这是定义良好的行为。只是在C++中没有定义。根据我的理解,未定义的行为意味着程序可以做任何正确的事情(包括格式化硬盘和启动鼻妖),从编译器的角度来看。这样的行为通常不是代码作者所期望的,这是一个完全无关的问题,不是编译器的错误。

关于Java和C#的行为,请参考以下链接:

- [pre post increment operator behavior in c c java c](http://stackoverflow.com/questions/6457130)

我可能对Java的行为有所错误。但是这两种语言的设计者看到了所有愚蠢的C++新手的问题,他们说不要被愚蠢的问题分心,只需定义行为即可。也许你可以指出关于Java的解释呢?

总结起来,C++中的预增和后增运算符的行为是未定义的,而Java和C#中的行为是定义良好的。

0
0 Comments

C、C++和Java中的前置和后置递增运算符行为并没有完全指定,编译器可以根据需要重新排序副作用。而C#中的前置和后置递增运算符行为是完全指定的(在单线程场景中),关于原子性、多处理器弱内存模型中读取和写入顺序的保证等方面的问题需要自行进行研究。

为了了解C#的行为,可以阅读C#规范。简单来说,C#中的子表达式按照优先级和结合性进行逻辑分组,然后从左到右进行评估。如果子表达式的评估导致前置或后置递增子表达式产生副作用,则副作用会在结果生成之前立即发生。

关于C++和C的行为,本文没有给出详细描述。但可以肯定的是,编译器在重排序副作用时有很大的自由度。

至于Java的行为,由于本文作者没有使用过Java,所以无法进行猜测。

在C#中,前置和后置递增运算符的行为是完全指定的。其他语言中的行为则不尽相同。想要了解更多关于C#的行为,可以阅读C#规范,或者参考相关问题的回答。

总结起来,此问题的出现原因是C、C++和Java中的前置和后置递增运算符行为没有完全指定,而C#中的行为是完全指定的。解决方法是阅读相关语言的规范或者参考相关问题的回答。

0
0 Comments

C, C++, Java和C#中的前增量和后增量运算符的行为存在差异。在Java和C#中,表达式从左到右进行求值,并且副作用立即可见。在C++中,子表达式的求值顺序是不确定的,并且在没有中间序列点的情况下对同一对象进行两次修改是未定义的行为。

为了解决这个问题,可以参考各种语言的规范或标准。在C中,可以查看N1256(PDF)的第6.5节第2段和第6.5.2.4节第2段。在Java中,可以参考JLS §15.7 "Evaluation Order",其中明确规定了操作数按照从左到右的顺序进行求值。在C++中,可以参考ISO/IEC 14882:2003(E) §5, ¶4。

这些规则和标准确保了对于前增量和后增量运算符的行为具有一致性和可预测性。这样,开发人员就可以根据自己的需求和预期来正确使用这些运算符,而不会导致不确定的结果。

0