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

二进制运算符何时在Java中执行?

艾璞瑜
2023-03-14
问题内容

我试图了解Java字节码。我从一个简单的例子开始:

public class Test
{
    public static void main(String args[])
    {
        System.out.println(2 + 1);
    }
}

我编译了这个类:

javac Test.java

然后我尝试javap在.class上像这样:

javap -c Test

这给了我这个:

Compiled from "Test.java"
public class Test {
  public Test();
    Code:
       0: aload_0       
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
       3: iconst_1      
       4: invokevirtual #3                  // Method java/io/PrintStream.println:(I)V
       7: return        
}

除了这一行,我可以理解其中的内容:

public static void main(java.lang.String[]);
. . . 
3: iconst_1    
. . .

查看我的源代码和此字节码,看起来javac已经为该语句完成了加法运算:

2+1

并要求jvm返回该常量。

如果我的理解是错误的,有人可以纠正我吗?javac 在实际在jvm上运行之前+,是否对-*等等进行编译操作?如果可以,怎么办?


问题答案:

2 +1是一个编译时常量表达式。编译器本身在字节码中将其替换为3。

请参阅Java语言规范,其中说:

一些表达式的值可以在编译时确定。这些是常量表达式。

有关常量表达式的内容,请参见另一章

常量表达式是表示原始类型或String的值的表达式,该值不会突然完成,并且仅使用以下内容组成:

  • 基本类型的文字和字符串类型的文字[…]
  • 加法运算符+和-[…]



 类似资料:
  • 我有两个错误。当我使用 二进制运算符' 我需要帮助!

  • 我想制作一个简单的Java程序,但我得到了以下错误: 这是我的代码:

  • 概述 二进制位运算符用于直接对二进制位进行计算,一共有7个。 二进制或运算符(or):符号为|,表示若两个二进制位都为0,则结果为0,否则为1。 二进制与运算符(and):符号为&,表示若两个二进制位都为1,则结果为1,否则为0。 二进制否运算符(not):符号为~,表示对一个二进制位取反。 异或运算符(xor):符号为^,表示若两个二进制位不相同,则结果为1,否则为0。 左移运算符(left s

  • 我理解CGFloat和Int之间的区别,但奇怪的是,我能够在if循环中使用 其中,image是未包装的UIImage及其大小。宽度是CGFloat,而数字200是Int类型,这可以在Xcode上运行,没有编译器错误。 然而与: Xcode返回错误: 二进制运算符' 并且Xcode无法运行。我在CGFloat上查看了Apple文档及其'=='和' 我的问题是,为什么一个有效,而另一个是错误?

  • 本文向大家介绍解析Python中的二进制位运算符,包括了解析Python中的二进制位运算符的使用技巧和注意事项,需要的朋友参考一下 下表列出了所有的Python语言的支持位运算符。假设变量a持有60和变量b持有13,则: 示例: 试试下面的例子就明白了所有的Python编程语言提供了位运算符: 当执行上面的程序它会产生以下结果: