【问题标题】:Logic of Java Operators && and ||Java 运算符 && 和 || 的逻辑
【发布时间】:2014-01-01 03:06:06
【问题描述】:

亲爱的程序员,你好,

我有一个字符串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++;
    }
}

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

我认为这些运算符的结果是:

&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

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

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

问候 卢卡斯·沃西茨

【问题讨论】:

    标签: java if-statement operators


    【解决方案1】:

    在第二个sn-p中,if子句永远为真,因为i永远不是2也不是5(因为它不能同时是2和5)

    对于你想做的第一个 sn-p 很好,它完全符合你的要求:如果你不在第三个元素也不在第 6 个元素,你想解析,否则你在一个日期中的点。

    【讨论】:

    • 想了一会儿你的回答我明白了,非常感谢你的快速回答!
    【解决方案2】:

    关键点在这里: 在&&中,如果第一种情况为假,第二种情况不会检查。

    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 // 评估 false 因为两者都是 false" - 不正确。因为第一个是 false ,所以第二个是未经测试的
    【解决方案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
    

    【讨论】:

      【解决方案4】:

      你的第二个 sn-p 不工作,因为它应该是

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

      并且您的第一个 sn-p 没有抛出错误,原因与您在那里使用 && 的原因相同。

      【讨论】:

      • 你把我知道的一切都告诉了我……不过还是谢谢
      【解决方案5】:

      选择一个数字,任何数字。要么不等于 2,要么不等于 5。

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

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

      【讨论】:

        【解决方案6】:

        我不是在回答你的问题,而是建议更好的代码。

        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 中删除] 时,这也将起作用

        【讨论】:

        • 感谢您的建议,但我需要根据生日创建一个数字总和,这就是为什么我需要每个数字。
        【解决方案7】:

        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. 如果 i = 5,LHS i is not equal to 2 为 TRUE,RHS i is not equal to 5 为 FALSE
        3. 对于 i 的所有其他值:LHS 和 RHS 都为真。

        【讨论】:

        • "|"不代表 OR :)
        • @rookieB 它确实代表 OR,但 bitwise OR,不代表逻辑 OR ;) 感谢您的关注 :)
        • 好吧,我没有看到您使用的是按位或,因为我认为这是一个错字
        猜你喜欢
        • 1970-01-01
        • 2012-02-04
        • 2019-08-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多