【问题标题】:What is difference between using logical operators using parentheses?使用括号使用逻辑运算符有什么区别?
【发布时间】:2020-02-17 15:42:26
【问题描述】:

我得到不同的结果:如果我使用括号则为 -1,如果我不使用括号则为 1。

对于测试用例“2019 年 10 月 30 日”,如果我在以下行中使用括号,则得到 -1,如果不使用括号,则得到 1:

else if((mm==1||mm==3||mm==5||mm==7||mm==8||mm==10||mm==12) && mm<13 && mm>0 && dd>0 && dd<32) return 1;

上线和下线有什么区别?

else if(mm==1||mm==3||mm==5||mm==7||mm==8||mm==10||mm==12 && mm<13 && mm>0 && dd>0 && dd<32) return 1;
public class Utility {
   public static int checkDate(String date){
     String []st;
   if((date.charAt(2)=='.' && date.charAt(5)=='.')||(date.charAt(2)=='/' && date.charAt(5)=='/')||(date.charAt(2)=='-' && date.charAt(5)=='-'))
   {
       String token = Character.toString(date.charAt(2));
       if(date.charAt(2) == '.') st = date.split("\\.");
       else st = date.split(token);

       int dd = Integer.parseInt(st[0]);
       int mm = Integer.parseInt(st[1]);
       int yy = Integer.parseInt(st[2]);

        if(mm == 2 && dd>0 && dd<30 && mm<13 && mm>0) return 1;

        else if((mm==1||mm==3||mm==5||mm==7||mm==8||mm==10||mm==12) && mm<13 && mm>0 && dd>0 && dd<32) return 1;

        else if((mm==4||mm==6||mm==9||mm==11) && dd>0 && dd<31 && mm<13 && mm>0) return 1;

        else return -1;
   }
   else return -1;
 }
}

import java.util.Scanner;


public class DateValidation {

    public static void main(String[] args) {

       // STUDENT CODE BEGINS HERE
        Scanner sc = new Scanner(System.in);
    String dt=sc.next();
    Utility ut = new Utility();
    int flag = ut.checkDate(dt);
    if(flag==1)
        System.out.println("Valid");
    else
        System.out.println("Invalid");
       // STUDENT CODE ENDs HERE

    }
}

【问题讨论】:

标签: java logical-operators parentheses


【解决方案1】:

它将执行以下(按最高优先级):

  • 括号()
  • 不是!
  • 还有&amp;&amp;
  • ||
else if((mm==1||mm==3||mm==5||mm==7||mm==8||mm==10||mm==12) && mm<13 && mm>0 && dd>0 && dd<32) 
    return 1;

它将首先评估(mm==1||mm==3||mm==5||mm==7||mm==8||mm==10||mm==12),然后是&amp;&amp; mm&lt;13 &amp;&amp; mm&gt;0 &amp;&amp; dd&gt;0 &amp;&amp; dd&lt;32

else if(mm==1||mm==3||mm==5||mm==7||mm==8||mm==10||mm==12 && mm<13 && mm>0 && dd>0 && dd<32) 
    return 1;

对于另一个,它将首先评估mm&lt;13 &amp;&amp; mm&gt;0 &amp;&amp; dd&gt;0 &amp;&amp; dd&lt;32,然后是mm==1||mm==3||mm==5||mm==7||mm==8||mm==10||mm==12 &amp;&amp;

【讨论】:

    【解决方案2】:

    括号决定了这些布尔值的解析顺序。 And 的绑定比 Or 强。在您的情况下,您要求:

    mm==12 && mm<13
    

    所以左比较和右比较必须解析为真。他们没有,就像您在第 10 个月一样。您决定用括号检查您的月份值是否有效,这将解析为 true,然后 &amp;&amp; 检查也解析为 true。

    【讨论】:

      【解决方案3】:

      考虑这个例子。

      
            int a = 5;
      
            System.out.println((a == 5 || a == 10) && a == 8 || a == 9); // false
            // evaluates to    true && false || false which is false
      
            System.out.println(a == 5 || a == 10 && a == 8 || a == 9);  // true
            // evaluate to true || false && false && false
            // the first true, wins because it is followed by an || so the whole
            // expression evaluates to true.
      

      对于a &amp;&amp; bab 都必须是 true 才能使语句为 true 对于a || b,只有ab 之一必须是true

      这也适用于分组表达式。

      如果一个表达式是true 而另一个是false,则完整的表达式是false 对应&amp;&amp; 和true 对应||。这些运算符从左到右工作,因此您需要进行适当的分组,就像算术表达式一样。

      最好的建议是始终使用括号来确保表达式的正确评估。

      【讨论】:

        猜你喜欢
        • 2015-07-03
        • 1970-01-01
        • 2012-10-01
        • 1970-01-01
        • 2015-02-22
        • 2014-01-17
        • 2021-01-02
        • 1970-01-01
        • 2015-06-30
        相关资源
        最近更新 更多