当前位置: 首页 > 面试题库 >

x = x + 1和x ++在实现上的差异

薛高澹
2023-03-14
问题内容

我的教授最近说,尽管x = x + 1并且x++显然会给出相同的结果,但是在JVM中实现它们的方式有所不同。这是什么意思?编译器是否不像:嘿,我明白了,x++所以我将其切换到x = x + 1并继续吗?

我怀疑在效率方面是否存在差异,但是如果在这些情况下组装会有所不同,我将感到惊讶…


问题答案:

我的教授最近说,尽管x = x + 1和x ++显然会给出相同的结果

我想你的教授也许是故意 x-after x = x + 1x++will
的价值是相同的
。只是重新措辞,因为它似乎在解释问题时造成了混乱。

好的,尽管的值x将相同,但是它们是不同的运算符,并且在字节码中使用不同的JVM指令。x + 1使用iadd指令,而x++使用iinc指令。尽管这取决于编译器。编译器可以自由地对特定操作使用不同的指令集。我已经针对javac编译器进行了检查。

对于 eclipse 编译器,来自@Holger的以下注释之一:

我只是用eclipse测试了它,并iinc为两个表达式生成了它。所以我发现一个编译器产生相同的指令

您可以使用javap命令检查字节码。让我们考虑以下类:

class Demo {
    public static void main(String[] args) {
        int x = 5;

        x = x + 1;
        System.out.println(x);

        x++;
        System.out.println(x);
    }
}

编译上面的源文件,并运行以下命令:

javap -c Demo

该代码将被编译为以下字节码(仅显示该main方法):

 public static void main(java.lang.String[]);
   Code:
      0: iconst_5
      1: istore_1
      2: iload_1
      3: iconst_1
      4: iadd
      5: istore_1
      6: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
      9: iload_1
     10: invokevirtual #3                  // Method java/io/PrintStream.println:(I)V
     13: iinc          1, 1
     16: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
     19: iload_1
     20: invokevirtual #3                  // Method java/io/PrintStream.println:(I)V
     23: return


 类似资料:
  • 我对Numpy中和之间的区别感到困惑。 例如,我有一个二维数组 当我尝试打印和时,它们都给了我相同的输出: 但是,当我试图通过添加一个维度来广播它时 他们给了我不同的结果。 我试图找出区别,但不能。

  • 将返回来自x(包括)和y(不包括)的流。将返回来自x(含)和y(含)的流。 我期望调用或调用。但是当查看的源代码时,它是这样的: 也有一个非常相似的实现,而不是。唯一的区别是的第三个参数是而不是表示范围已关闭。 然后使用此布尔值初始化类中的字段,并针对它提到以下注释: 如果该范围已关闭且最后一个元素未被遍历,则为1,如果该范围已打开,或该范围已关闭且所有元素都已被遍历,则为0 为什么需要这样的实现

  • 我想知道为什么numpy中有一维的维度数组(length,1),也有一维的维数组(lendth,),没有第二个值。 我经常遇到这种情况,例如在使用< code>np.concatenate()时,这需要预先执行< code>reshape步骤(或者我可以直接使用< code > h stack /< code > v stack )。 我想不出这种行为可取的理由。有人能解释一下吗? 编辑:< br

  • 问题内容: 我曾经听过一位老师丢弃它,此后一直困扰着我。假设我们要检查整数是否大于或等于0。有两种检查方法: 和 据这个老师说会快一些。在这种情况下,它是Java,但据他说,这也适用于C,c ++和其他语言。这句话有什么道理吗? 问题答案: 在现实世界中没有任何区别。 让我们看一下各种编译器为各种目标生成的代码。 我假设一个有符号的int操作(这似乎是OP的意图) 通过调查,我仅限于C和我手边的编

  • 根据这位老师的说法,会比稍微快一点。在本例中,它是Java,但据他说,这也适用于C、C++和其他语言。这种说法有道理吗?

  • 问题内容: 我已经回顾了关于Struts 1 vs 2的几个问题,但是似乎没有一个人以我的观点来回答这个问题。 我将开始着手构建一个新系统,对一个非常老的桌面应用程序进行彻底的重新设计。目标是使其成为基于Web的网站,添加更多功能,使其更易使用等(通常的重新设计原因)。 将要开发该系统的团队主要是Java开发人员,并且在过去5年中广泛地研究了Struts1.x。 该系统打算使用很多年,因此,当一个