Java 编译器如何处理选择语句的变化

Java 编译器如何处理选择语句的变化,java,compiler-construction,jvm,javac,bytecode,Java,Compiler Construction,Jvm,Javac,Bytecode,以下三种方法在功能上都是相同的,但我认为它们都有风格上的差异。编译这些文件时,编译器是否会对它们进行不同的处理?(我缺乏检查和理解反编译字节码的诀窍) //方法1 私有布尔值isAcceptableRange(final int a,final int b){ if((Math.abs(a-b))我也没有看过字节码。但根据我对编译器技术的一般知识:if(condition){then part}else{else part}生成的代码基本上类似于: if (!condition) branch

以下三种方法在功能上都是相同的,但我认为它们都有风格上的差异。编译这些文件时,编译器是否会对它们进行不同的处理?(我缺乏检查和理解反编译字节码的诀窍)

//方法1
私有布尔值isAcceptableRange(final int a,final int b){

if((Math.abs(a-b))我也没有看过字节码。但根据我对编译器技术的一般知识:
if(condition){then part}else{else part}
生成的代码基本上类似于:

if (!condition) branch to Label_1;
perform then-part;
branch to Label_2;
Label_1:
perform else-part;
Label_2:
在您的示例#1中,“then part”是一个
return
语句。而
return
语句的代码可能是
return
指令,或者是一个
分支
到子程序代码末尾执行清理的某个点(包括任何
最终生效的
)然后返回。一个好的编译器不会在另一个无条件分支或
return
指令之后生成分支(或任何其他代码),因为该代码永远无法执行。因此示例1最终看起来像

if (!condition) branch to Label_1;
set return value to "true";
return or branch to cleanup code;
Label_1:
set return value to "false";
return or branch to cleanup code;
这与示例2或示例3生成的代码完全相同


因此,您的问题的答案是:不,编译器不会以不同的方式处理您的任何示例,除非它是一个非常糟糕的编译器。

我也没有看过字节码。但是根据我对编译器技术的一般知识:
if(condition){then part}else{else part}
生成的代码基本上如下所示:

if (!condition) branch to Label_1;
perform then-part;
branch to Label_2;
Label_1:
perform else-part;
Label_2:
在您的示例#1中,“then part”是一个
return
语句。而
return
语句的代码可能是
return
指令,或者是一个
分支
到子程序代码末尾执行清理的某个点(包括任何
最终生效的
)然后返回。一个好的编译器不会在另一个无条件分支或
return
指令之后生成分支(或任何其他代码),因为该代码永远无法执行。因此示例1最终看起来像

if (!condition) branch to Label_1;
set return value to "true";
return or branch to cleanup code;
Label_1:
set return value to "false";
return or branch to cleanup code;
这与示例2或示例3生成的代码完全相同

因此,您的问题的答案是:不,编译器不会以不同的方式处理任何示例,除非它是一个非常糟糕的编译器

或者编译器是否知道最终结果并将其“优化”掉

是的。让我们看看产生的字节码:

javap -c -private MyClass.class
  • javap
    :是一种工具,它(除其他外)可以让您查看java类的字节码,它与JDK一起提供
  • -c
    :将代码反汇编为字节码
  • -private
    :显示类中的私有成员和方法
  • MyClass.class
    :编译后的类

我调用了方法
isAcceptableRange1
isAcceptableRange2
isAcceptableRange3
。正如您所看到的,所有方法都有完全相同的字节码

或者编译器是否知道最终结果并将其“优化”掉

是的。让我们看看产生的字节码:

javap -c -private MyClass.class
  • javap
    :是一种工具,它(除其他外)可以让您查看java类的字节码,它与JDK一起提供
  • -c
    :将代码反汇编为字节码
  • -private
    :显示类中的私有成员和方法
  • MyClass.class
    :编译后的类


我调用了方法
isAcceptableRange1
isAcceptableRange2
isAcceptableRange3
。正如您所看到的,所有方法都有完全相同的字节码。

您可以使用
javap-c
查看字节码。我仍然建议使用
return(Math.abs(a-b))您可以使用
javap-c
查看字节码。我仍然建议使用
return(Math.abs(a-b))