各位看看这里是出了什么问题,怎么老是说一定为true
各位看看这里是出了什么问题,怎么老是说一定为true
各位看看这里是出了什么问题,怎么老是说一定为true
id: while (true)
{
System.out.println("请输入你的身份证号码");
String idNumber = sc.next();
if (idNumber.length() != 18)//判断长度
{
System.out.println("长度须为18位");
}
else//位数为18位
{
for (int i = 0; i < idNumber.length() - 1; i++)//前17位为数字
{
char c = idNumber.charAt(i);
if (c < '0' || c > '9')
{
System.out.println("身份证号码前17位,必须都是数字");
break id;
}
}
//不能以0为开头 最为一位可以是数字,也可以是大写X或小写x
char firstC = idNumber.charAt(0);
char endC = idNumber.charAt(17);
if (firstC == 0 || (endC < '0' || endC > '9' ) || (endC != 'x' || endC != 'X'))
{
System.out.println("身份证格式有误");
System.out.println("不能以0为开头 最为一位可以是数字,也可以是大写X或小写x");
}
}
}
你最后这个逻辑判断存在些问题,
如果endC是小写x字符,也会打印身份证有误这句话
如果endC是大写x字符,也会打印身份证有误这句话
而且不反向思维一下,通过条件筛选出符合条件的,然后剩下的就是不符合条件的啊
如最后的if判断代码可以改成这样
if (firstC != 0 &&((endC >='0' && endC <= '9' ) || (endC == 'x' || endC == 'X')))
如果你想坚持原来的思路,可以这样改
if (firstC == 0 || (endC < '0' || endC > '9' ) || (endC != 'x' | endC != 'X'))
一个|是不会出现短路的情况的话,无论前面是否正确,后面的条件都会执行
1.逻辑非:就是取反的意思,false变成true,true变成false。
2.逻辑与:同时满足条件的时候值为true,两个都是true才会变成true
3.逻辑或:一方满足条件的时候值为true,其中任意一个是true
https://edu.csdn.net/job/javabe_01/java-1383285d96584ec093b1d02f93fe983d
最后(endC != 'x' || endC != 'X')永远真
|| :同假为假,否则为真
建议1:可以先把与或非的判断逻辑再熟悉下
建议2:这么多条件的情况下,可以分成多个判断,这样代码可读性也比较好
(1)endC != 'x' || endC != 'X' 表示:(end 不等于 x ) 或者 (end 不等于 X ),这当然必然是 true!
(2)firstC == '0',不是 firstC == 0
(3)(endC < '0' || endC > '9' ) 表示小于 0 的字符 或 大于 9 的字符,也不对