【问题标题】:sequence point concept in javajava中的序列点概念
【发布时间】:2010-09-15 18:11:24
【问题描述】:

我是 Java 新手,并且有 C 的背景。我正在阅读 Khalid Moughal 的书。 在第 126 页,他举了一个例子

   int i = 10;

   int k = ++i + --i; // ((++i) + (--i)).

这显然违反了 C 中的序列点概念,即不能在同一个序列点中多次更改变量的值。 我的问题是相同的序列点规则是否适用于java? 可能他举这个例子只是为了解释前缀一元运算符的概念和它的副作用,但是像 Khalid Moughal 这样著名的书中不会想到这样一个明显违反语言非常基本规则的例子。

所以请确认一下。

希望你们把它带入正确的精神。

谢谢,

马维亚

【问题讨论】:

  • C 有很多包袱,因为在编写标准之前有数十个编译器和数百万个现有程序,因此他们必须以不会破坏的方式制定标准依赖于特定编译器优化事物方式的程序。此外,优化非常原始,这解释了register 关键字,它允许程序员执行任何体面的编译器都可以做得更好的微优化。

标签: java


【解决方案1】:

我的问题是相同的序列点规则是否适用于java?

不,Java 中没有序列点。评估顺序(等)在 Java 中得到了很好的定义。

另请阅读this 答案。

【讨论】:

  • 即使订单已明确定义,但应注意任何教授编写此类代码的人都应当场吊销其许可证...
  • 我来这里是因为一个更实际的例子。我想知道在 Java 中执行以下操作是否安全...dest[i] = source[i++];,我认为答案是肯定的。
【解决方案2】:

不,java中没有序列点的概念,并且顺序是完全定义的。一般来说,表达式是从左到右计算的。关于正式的定义,你可以阅读 JLS,第 15.7 节关于计算顺序。 见this链接。

【讨论】:

    猜你喜欢
    • 2012-02-18
    • 2016-09-21
    • 2017-01-13
    • 1970-01-01
    • 1970-01-01
    • 2011-01-20
    • 1970-01-01
    • 2012-08-11
    • 2012-09-05
    相关资源
    最近更新 更多