告诉你java在&和&&在逻辑运算上差别的原因

来源:互联网 发布:软件行业人均产值 编辑:程序博客网 时间:2024/04/29 19:49
源代码如下:
public class LogicalOperator{        public static void Test1(int x,int y){                if(x > 1 && y > 1)                        System.out.println("&&");        }        public static void Test2(int x,int y){                if(x > 1 & y > 1)                        System.out.println("&");        }}

利用javap -c得到这两个方法的反汇编结果(已经加上了我的注释):

 

Test1:  

  public static void Test1(int, int);    Code:       0: iload_0                           //x入栈       1: iconst_1                          //1入栈       2: if_icmple     18                  //如果x<=1,跳到18,就是每个指令前面的字节偏移       5: iload_1                           //y入栈       6: iconst_1                          //1入栈       7: if_icmple     18                  //如果y<=1,跳到18      10: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;      13: ldc           #3                  // String &&      15: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V      18: return  

 可以发现如果第一个条件不满足也就是x>1为假就直接不进行下次判断了。

 

Test2:

  public static void Test2(int, int);    Code:       0: iload_0                           //x入栈                  1: iconst_1                          //1入栈            2: if_icmple     9                   //如果x<=1,跳到9       5: iconst_1                          //1入栈       6: goto          10                  //跳到10       9: iconst_0                          //0入栈      10: iload_1                           //y入栈      11: iconst_1                          //1入栈      12: if_icmple     19                  //如果y<=1,跳到19      15: iconst_1                          //1入栈      16: goto          20                  //跳到20      19: iconst_0                          //0入栈      20: iand                              //栈顶两int型数值按位与,并且结果进栈      21: ifeq          32                  //当栈顶int型数值等于0时跳转到32      24: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;      27: ldc           #5                  // String &      29: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V      32: return        


可以发现及时第一个条件不满足也需要进行第二个条件的判断,最后在根据这两次判断的结果进行代码流向控制

写到这大家对&和&&在做逻辑操作时候的差异应该有了更深的认识了。

 

关于 | 和 || 操作符请读者们自己操作吧!

0 0
原创粉丝点击