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

源代码如下:
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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值