源代码如下:
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
可以发现及时第一个条件不满足也需要进行第二个条件的判断,最后在根据这两次判断的结果进行代码流向控制
写到这大家对&和&&在做逻辑操作时候的差异应该有了更深的认识了。
关于 | 和 || 操作符请读者们自己操作吧!