使用带括号的逻辑运算符有什么区别?
What is difference between using logical operators using 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
}
}
括号决定这些布尔值的解析顺序。 And 比 Or 结合更强。在您的情况下,您要求:
mm==12 && mm<13
所以左比较和右比较必须解析为真。他们没有,因为你在第 10 个月。在括号中你决定检查你的月份值是否有效,这解析为真,然后 &&
检查也解析为真。
考虑这个例子。
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
,a
和 b
都必须是 true
才能使语句成为 true
对于 a || b
,只有 a
和 b
之一必须是 true
。
这也适用于分组表达式。
如果一个表达式是 true
,另一个是 false
,则完整的表达式对于 &&
为 false
,对于 ||
为真。这些运算符从左到右工作,因此您需要适当地分组,就像算术表达式一样。
最好的建议是始终使用括号以确保正确计算表达式。
它将执行以下(以最高优先顺序):
- 括号
()
- 不是
!
- 和
&&
- 或
||
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;如果我不使用括号,则为 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
}
}
括号决定这些布尔值的解析顺序。 And 比 Or 结合更强。在您的情况下,您要求:
mm==12 && mm<13
所以左比较和右比较必须解析为真。他们没有,因为你在第 10 个月。在括号中你决定检查你的月份值是否有效,这解析为真,然后 &&
检查也解析为真。
考虑这个例子。
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
,a
和 b
都必须是 true
才能使语句成为 true
对于 a || b
,只有 a
和 b
之一必须是 true
。
这也适用于分组表达式。
如果一个表达式是 true
,另一个是 false
,则完整的表达式对于 &&
为 false
,对于 ||
为真。这些运算符从左到右工作,因此您需要适当地分组,就像算术表达式一样。
最好的建议是始终使用括号以确保正确计算表达式。
它将执行以下(以最高优先顺序):
- 括号
()
- 不是
!
- 和
&&
- 或
||
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 &&