Java

编译器的两点优化

2019-07-07  本文已影响0人  PetrichorHH

1.编译器的常量优化

在给变量进行赋值的时候,如果右侧的表达式当中全部是常量,没有任何变量,


        例如:short num = 1 + 11;  // 等号右边全都是常量,没有任何变量参与运算


那么编译器javac将会直接计算出右侧的运算结果,并赋给左侧变量。

编译之后,得到的class字节码中相当于如下的语句:


        short num = 12;  // 右侧的常量结果没有超过左侧定义的数值范围,所以正确。


注意:一旦右侧表达式中有变量参与,那么这种优化就不会进行了。

2.数据类型“隐式强制”转换

对于byte、short、char三种数据类型来说,初始化赋值时为:


        byte b1 = 1;

        short s2 = 2;

        char c3 = 3;


此时,右侧本质上是一个int,

而将一个int赋值给byte、short、char时,应该进行强制类型转换,如


         byte b1 = (byte) 1;

        short s2 = (short) 2;

        char c3 = (char) 3;


但是在定义这三种类型时,我们一般采用前者,而不采用后者。

一方面是因为前者书写量少,

另一方面是因为对于byte、short、char三种类型来说,定义时当右侧数值没有超过范围,那么javac编译器会自动隐含的帮我们补上(byte)、(short)、(char)

注意:1. 右侧的数值未超过左侧的范围时,编译器自动补上强转。

           2. 右侧的数值超过了左侧的范围时,编译器直接报错。

上一篇下一篇

猜你喜欢

热点阅读