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

5

亲爱的程序员们,你好:

我有一个字符串 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语句中的运算符。我认为这些运算符的结果是: && 运算符:
如果左侧和右侧的操作数都为true,则返回true,否则返回false。 || 运算符:
如果左侧或者右侧的操作数为true,则返回true,否则返回false。
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个回答

7
在第二个片段中,if语句将始终为true,因为i永远不会是2或5(因为它不能同时是2和5)。
对于你想要做的事情,你的第一个片段很好,它正好做了你想要做的事情:如果你不是在第三个元素或第六个元素,你想要解析,否则你就在日期的某个点上。

经过一段时间的思考,我理解了你的回答,非常感谢你的快速回复! - Lukas Warsitz

3

关键点在于:使用 && 时,如果第一个条件为假,那么第二个条件将不会被检测。

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

"false && false // 因为两者都是假,所以评估结果为假" - 这不是正确的。因为第一个是假的,所以第二个没有被测试。 - pratim_b

3
虽然LionC提到的不一定是你的问题。
4个逻辑运算符(and和or)遵循以下逻辑: &与上面描述的&&相同。
false + false = false
true  + false = false
false + true  = false
true  + true  = true

| 就像你上面描述的那样是 ||

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

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

&& 表示逻辑与运算符。

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

||

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

1

你的第二段代码无法运行,因为应该是:

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

你的第一个代码片段没有出错,是因为你在那里使用了 && 运算符。


你告诉了我我之前已经知道的一切... 不过还是谢谢。 - Lukas Warsitz

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";时[从09中删除0]。

谢谢您的建议,但我需要从出生日期创建一个数字总和,这就是为什么我需要每个单独的数字。 - Lukas Warsitz

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不等于2为假,RHS i不等于5为真
  2. 如果i = 5,则LHS i不等于2为真,RHS i不等于5为假
  3. 对于所有其他值的i:LHS和RHS都为真。

“|” 不代表 OR :) - pratim_b
@rookieB 它确实代表OR,但是是按位或,而不是逻辑或 ;) 谢谢你注意到了 :) - Infinite Recursion
1
我看不到你使用按位或运算符,我以为那是一个打字错误。 - pratim_b

1
选择一个数字,任何数字。它要么不等于2,要么不等于5。
因此,表达式(i != 2 || i != 5)可以静态地(由编译器)转换为true,并且整个if控制结构被消除。
显而易见的结果是,如果任何一个字符不是数字,则会出现NumberFormatException

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接