Java 中的逻辑或显示意外结果
Logical OR in Java shows unexpected results
这是我的代码:
Scanner s = new Scanner(System.in);
int t = s.nextInt();
String [] pair_left = new String[t];
String [] pair_right = new String[t];
for (int i = 0; i < t; i++) {
pair_left[i] = s.next();
pair_right[i] = s.next();
}
HashSet hs1=new HashSet();
HashSet hs2=new HashSet();
int j=0;
for(int i=0;i<t;i++){
if(hs1.add(pair_left[i])||hs2.add(pair_right[i])){
j++;
System.out.println(j);
}
else {
System.out.println(j);
}
}
并且输入是:
5
john tom
john mary
john tom
mary anna
mary anna
现在 i=2
然后 hs1.add(pair_left[i])
return 为假然后它转到 hs2.add(pair_right[i])
这也 return 'false' 所以 hs1.add(pair_left[i])||hs2.add(pair_right[i])
应该 return 'false' 但在我的例子中它显示 true
。为什么?
当我用按位或替换逻辑或时,它显示了正确的结果。
如果有更好的方法来做这个,那么也给那个。
您应该知道 ||
逻辑 OR 是短路的,因此如果 hs1.add(pair_left[i])
returns 为真,则不会计算 hs2.add(pair_right[i])
。
另一方面,正如您所注意到的,当您使用 |
时,它是非短路逻辑或(请注意 |
不仅是 按位或), 两个操作数总是计算。
这是我的代码:
Scanner s = new Scanner(System.in);
int t = s.nextInt();
String [] pair_left = new String[t];
String [] pair_right = new String[t];
for (int i = 0; i < t; i++) {
pair_left[i] = s.next();
pair_right[i] = s.next();
}
HashSet hs1=new HashSet();
HashSet hs2=new HashSet();
int j=0;
for(int i=0;i<t;i++){
if(hs1.add(pair_left[i])||hs2.add(pair_right[i])){
j++;
System.out.println(j);
}
else {
System.out.println(j);
}
}
并且输入是:
5
john tom
john mary
john tom
mary anna
mary anna
现在 i=2
然后 hs1.add(pair_left[i])
return 为假然后它转到 hs2.add(pair_right[i])
这也 return 'false' 所以 hs1.add(pair_left[i])||hs2.add(pair_right[i])
应该 return 'false' 但在我的例子中它显示 true
。为什么?
当我用按位或替换逻辑或时,它显示了正确的结果。 如果有更好的方法来做这个,那么也给那个。
您应该知道 ||
逻辑 OR 是短路的,因此如果 hs1.add(pair_left[i])
returns 为真,则不会计算 hs2.add(pair_right[i])
。
另一方面,正如您所注意到的,当您使用 |
时,它是非短路逻辑或(请注意 |
不仅是 按位或), 两个操作数总是计算。