Java运算符的逻辑&&和||

时间:2013-12-13 11:03:18

标签: java if-statement operators

Hello亲爱的程序员,

我有一个字符串String input = "30.09.1993"; 然后我想将这个字符串中的所有数字保存在一个数组中(只有数字!)。 “。”在索引2和5所以我想在我的循环中使用if语句跳过我的字符串的这些部分。

我解决了我的问题,一切正常,但我对&&||运算符的逻辑感到困惑。

这是我的工作代码:

String input = "30.09.1993";
int[] eachNumbers = new int[8];

int x = 0;
for(int i = 0; i <= 9; i++){
    if(i != 2 && i != 5){
       eachNumbers[x] = Integer.parseInt(input.substring(i, i+1));
       x++;
    }
}

这是不起作用的代码:

String input = "30.09.1993";
int[] eachNumbers = new int[8];

int x = 0;
for(int i = 0; i <= 9; i++){
    if(i != 2 || i != 5){
       eachNumbers[x] = Integer.parseInt(input.substring(i, i+1));
       x++;
    }
}

这两个代码片段之间的唯一区别是if子句中的运算符。

我认为这些运营商的结果是:

&&运营商:

false + false = false
true  + false = false
false + true  = false
true  + true  = true

||运营商:

false + false = false
true  + false = true
false + true  = true
true  + true  = true

所以在我看来第二个代码片段应该可以工作,第一个应该抛出一个NumberFormatException。但事实并非如此。

我确信现在有一些更好的解决方案,但我的问题只是关于if语句中的逻辑。有人能解释一下这背后的逻辑吗?我完全感到困惑,并感谢每一个有帮助的答案。

问候 Lukas Warsitz

7 个答案:

答案 0 :(得分:7)

在第二个片段中,if子句将始终为true,因为i将始终不是2或不是5(因为它不能同时为2和5)

对于你想要做的事情你的第一个片段很好,它完全符合你的要求:如果你不是第三个元素而不是第6个元素,你想要解析,否则你就是其中一个点在约会。

答案 1 :(得分:3)

关键点在于: In&amp;&amp;如果第一种情况是假的,则第二种情况不会检查。

true && false // Evaluates false because the second is false 
false && true // Evaluates false because the first is false 
true && true // Evaluates true because both are true 
false && false // Evaluates false because the first is false

在||如果第一种情况属实,则第二种情况不会检查。

true || false // Evaluates true because the first is true 
false || true // Evaluates true because the second is true 
true || true // Evaluates true because the first is true
false || false // Evaluates false because both are false

答案 2 :(得分:3)

虽然不一定是LionC注意到的问题。

4和or逻辑运算符遵循以下逻辑:

&amp; 就像你描述的那样&amp;&amp;上方。

false + false = false
true  + false = false
false + true  = false
true  + true  = true

| 与上面的||

相同
false + false = false
true  + false = true
false + true  = true
true  + true  = true

&安培;&安培;和||是快捷运算符,如果它对结果没有影响,则不测试第二个值。

&amp;&amp;

false + untested = false
true  + false = false
false + untested = false
true  + true  = true

||

false + false = false
true  + untested = true
false + true  = true
true  + untested  = true

答案 3 :(得分:1)

您的第二个代码段不起作用,因为它应该是

if(i != 2 && i != 5)

并且您的第一个代码段没有抛出错误,原因与您使用过&amp;&amp;那里。

答案 4 :(得分:1)

选择一个号码任意数字。它不等于2,或者不等于5.

因此,表达式(i != 2 || i != 5)可以静态地(由编译器)转换为仅true并且整个if控制结构被消除。

如果任何的字符不是数字,那么显而易见的结果是NumberFormatException

答案 5 :(得分:1)

我没有回答你的问题,但建议更好的代码。

public class splitToArray {
    public static void main(String[] args) {
        String input = "30.09.1993";    
        input = input.replace(".", " ");
        String array[] = input.split(" ");
        for(String value : array){
            System.out.println(value);
        }
    }
}

Output:
30
09
1993

现在使用Integer.parseInt获取整数值。当String input = "30.9.1993"; [0从09]

中删除时,这也会有效

答案 6 :(得分:1)

i一次只能有一个值 因此,以下任何条件均有效:

if(i != 2 && i != 5) //means `i` is not any 2 AND i is not 5

if(i == 2 || i == 5) //means `i` is either 2 OR 5

注意:(i != 2 || i != 5)始终为真,因为

  
      
  1. 如果i = 2,则LHS i is not equal to 2为FALSE且RHS i is not equal to 5为TRUE
  2.   
  3. 如果i = 5,则LHS i is not equal to 2为TRUE且RHS i is not equal to 5为FALSE
  4.   
  5. 对于i的所有其他值:LHS和RHS都是真的。
  6.