【问题标题】:Logical OR in Java shows unexpected results [duplicate]Java中的逻辑或显示意外结果[重复]
【发布时间】:2016-07-25 11:57:25
【问题描述】:

这是我的代码:

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]) 返回false 然后它转到hs2.add(pair_right[i]) 这也返回'false'所以hs1.add(pair_left[i])||hs2.add(pair_right[i]) 应该返回'false' 但在我的情况下它显示true。为什么?

当我用按位或替换逻辑或时,它会显示正确的结果。 如果有任何更好的方法可以做到这一点,那么也给它。

【问题讨论】:

    标签: java logical-or


    【解决方案1】:

    您应该知道 || 逻辑 OR 是短路的,因此如果 hs1.add(pair_left[i]) 返回 true,则不会评估 hs2.add(pair_right[i])

    另一方面,正如您所注意到的,当您使用| 时,它是非短路逻辑或(请注意,| 不仅仅是按位或),两个操作数都是总是被评估。

    【讨论】:

    • 但是如果 hs1.add(pair_left[i]) 返回 false 那么它评估 hs2.add(pair_right[i]) 也是 false 然后 hs1.add(pair_left[i])||hs2 .add(pair_right[i]) 应该返回 false 但在我的情况下它返回 true 为什么?
    • @JatinBansal 在第一次迭代 (i==0) 中,hs1.add(pair_left[i]) 返回 true(因为 Set 为空),因此不评估 hs2.add(pair_right[i])。因此,当 i==2 时,hs1.add(pair_left[i]) 返回 false 而 hs2.add(pair_right[i]) 返回 true(因为第一次迭代中没有添加 tom)。
    • 好的,谢谢我知道了
    猜你喜欢
    • 2016-05-03
    • 1970-01-01
    • 1970-01-01
    • 2018-05-31
    • 1970-01-01
    • 2017-09-01
    • 1970-01-01
    • 2013-02-19
    • 1970-01-01
    相关资源
    最近更新 更多