使用带有括号的逻辑运算符有什么区别?

时间:2019-10-21 14:14:22

标签: java logical-operators parentheses

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

对于测试用例“ 30/10/2019”,如果在下面的行中使用括号,则得到-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

    }
}

3 个答案:

答案 0 :(得分: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;

它将首先评估(mm==1||mm==3||mm==5||mm==7||mm==8||mm==10||mm==12),然后评估&& mm<13 && mm>0 && dd>0 && dd<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<13 && mm>0 && dd>0 && dd<32,然后评估mm==1||mm==3||mm==5||mm==7||mm==8||mm==10||mm==12 &&

答案 1 :(得分:0)

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

mm==12 && mm<13

因此,左比较和右比较必须解析为true。它们与您在第10个月时的情况不同。使用括号,您决定检查您的月份值是否完全有效,然后解析为true,然后&&检查也解析为true。

答案 2 :(得分:0)

请考虑以下示例。


      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 && b时,ab都必须为true,语句才能为true 对于a || b,只有ab中的一个必须为true

这也适用于分组表达式。

如果一个表达式为true,另一个表达式为false,则完整表达式为false&&,对于||为true。这些运算符从左到右工作,因此您需要适当地分组,就像算术表达式一样。

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