首先,如果语句始终为真,但是第二个则不是

时间:2018-08-22 06:29:24

标签: java

如果以前已经问过这个问题,我谨此致歉。

这里有一些代码。

    int id1 = 1234;
    int id2 = 5678;
    int idPass1 = 123;
    int idPass2 = 456;

    System.out.println("Welcome. Please enter your Employee ID.");
    while(true) {
        int id = input.nextInt();
        //add more if needed
        if(id != id1 || id != id2){
            System.out.println("Employee does not exist. Please try again.");
        } else {
            break;
        }
    }
    System.out.println("Please enter your password.");
    while(true){
        int idPass = input.nextInt();
        //add more if needed
        if(idPass != idPass1 || idPass != idPass2){
            System.out.println("Incorrect Password entered. Please try again.");
        } else {
            break;
        }
    }

如您所见。 2个if / else语句完全相同,除了变量。在IntelliJ中,第一个带有ID的语句说这始终是正确的。第二条带有密码的声明不会给我该警告。

如果第二条if / else语句完全相同(减去变量)并且不总是为true,那么第一条if / else语句如何始终为真?

(在此代码之前声明了扫描仪。)

8 个答案:

答案 0 :(得分:8)

由于您的id1id2不相等,因此表达式(id != id1 || id != id2)始终应评估为true。您可能要使用&&来代替||。然后您的代码进入第一个循环,导致第二个表达式未求值,因此没有警告。

答案 1 :(得分:2)

IntelliJ之所以没有告诉您有关第二个if的任何信息,是因为它检测到您永远无法输入第二个while

实际上,突破第一个while的唯一方法是有一个例外,即使这样,您也不会输入第二个while

因此,IntelliJ无需检查第二while内发生的任何事情。

答案 2 :(得分:0)

您的逻辑不正确,if语句应与两个相等性检查一起 AND

if (id != id1 && id != id2) {
    System.out.println("Employee does not exist. Please try again.");
}

只要输入idid1id2,即< / p>

NOT (id = id1 || id = id2)

根据DeMorgan的定律,NOT (p OR q)变为NOT p AND NOT q

编辑:第二个循环永远不会被点击的原因很简单,这是因为第一个循环永远不会退出。但是,重要的是要了解德摩根的定律。这种错误经常在这里出现。

答案 3 :(得分:0)

问题与您使用||(或)有关。程序逻辑看到的是,“如果id不等于id1的值 OR ,则id不等于id2则该语句为true。”

由于您不能同时拥有两个数字的ID,因此它将始终为true。

-编辑-

您的IDE足够聪明,可以识别此问题,并且将看到您永远无法退出第一个while循环。这意味着您永远不会到达第二个if语句,也永远不会对它产生正面或负面的评价。

要解决此问题,请改用&&运算符查看它们是否不等于任何一个ID。

此外,任何一个ID都可以使用任何一个密码,因为没有任何与ID密码匹配的ID

答案 4 :(得分:0)

因为第一个if始终为true,并且if节中没有中断,而while循环永远不会结束。可能就是第二个不显示警告的原因。

尝试在第一个while部分中注释,然后查看第二个警告是否显示。

另外,在两次while循环之间,您的代码有一个错误,应该使用input.nextLine(),因为当您输入第一个输入并按Enter时,第一个input.nextLine()将使用int而不是新行并将其传递给第二个input.nextLine()。因此,要消费换行符,请在两个input.nextLine()之间插入nextInt()

答案 5 :(得分:0)

由于使用的是逻辑OR运算符,因此只有一个TRUE值足以执行IF块。您的ID可以是ID1,ID2或其他名称。如果id = id1,则左侧为FALSE,右侧为TRUE。如果id = id2,则左侧为TRUE,右侧为FALSE。如果id是其他东西,则双方都是TRUE。在每种情况下,条件检查最终都为TRUE。因此,IF块始终为TRUE。您必须对其进行如下修改;

if(id == id1 || id == id2){
    break;
} else {
    System.out.println("Employee does not exist. Please try again.");        
}

OR

if(id != id1 && id != id2){
    System.out.println("Employee does not exist. Please try again.");
} else {
    break;
}

答案 6 :(得分:0)

的确 id!= id1 || id!= id2 永远不会为假,因为id1和id2的值是不同的,并且如果id == id1则id不能等于id2,因此在这种情况下条件将永远为真 如果您修复了该警告,则intellij将在条件条件下的下一个while循环中向您显示警告,并且同样情况也适用于(idPass!= idPass1 || idPass!= idPass2)条件。

答案 7 :(得分:0)

根据您的静态代码,您只能在真值表中包含这种情况,并且将它们解析为true:

x y z | x != y | x != z | v
---------------------------
0 0 1 |    0   |    1   | 1
0 1 0 |    1   |    0   | 1
1 0 1 |    1   |    0   | 1
1 1 0 |    0   |    1   | 1