怎么老是说一定为true各位看看这里是出了什么问题,怎么老是说一定为true各位看看这里是出了什么问题,怎么老是说一定为true

各位看看这里是出了什么问题,怎么老是说一定为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");
                }
            }

        }

img

img

你最后这个逻辑判断存在些问题,

如果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 的字符,也不对