C和Java之间的表达式评估顺序如何不同?

尝试了解这个页面上的例子,我的大脑起皱了:
http://answers.yahoo.com/question/index?qid=20091103170907AAxXYG9

更具体的这个代码

int j = 4;
cout << j++ << j << ++j << endl;

给出输出:566

在这对我来说是有意义的,如果表达式从左到右进行评估,但是在Java中也是类似的表达式:

int j = 4;
System.out.print("" + (j++) + (j) + (++j));

输出:456

这更直观,因为这表明它已经从左到右进行了评估.在各种网站上进行研究,似乎C在编译器之间的行为不尽相同,但我仍然不相信我的理解. Java和C之间的评估差异有什么解释?谢谢你.

解决方法

当操作有副作用时,C依赖于 sequence points规则来确定副作用(如增量,组合赋值等)是否必须生效.逻辑和/或/或其他(&&和||)运算符,三元?问号运算符和逗号创建序列点;,–,<等等不要. 相比之下,Java在进行进一步评估之前会完成副作用. 当您在没有序列点的情况下多次使用具有副作用的表达式时,C中未定义结果行为.任何结果都是可能的,包括没有逻辑意义的结果.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...