Java: Not operator in if 语句打印 "error" 和正确的语句?

Java: Not operator in if statement prints "error" and correct statement?

这快把我逼疯了。这是一个非常简单的程序。当操作错误时它只打印"error",这样很好。但我遇到的问题是,当正确的答案输入控制台时,它会同时打印正确的语句和错误。我不明白为什么。我确信这很容易,但我没有看到它。

import java.util.Scanner;

public class MeowSample{
    public static void main(String[] args) {

    Scanner okay = new Scanner(System.in);
    System.out.println("Please enter a letter ");
    char letter = okay.next().charAt(0);
    if(letter != 'x' || letter != 'y' || letter != 'z' || letter != 'q'){
        System.out.println("Errorrr");
    }
    if(letter == 'x' || letter == 'y' || letter == 'z'|| letter == 'q'){
        System.out.println("Correct!");
        }
    }
}

提前致谢!

你的两个 if 语句并不相互排斥。尝试:

import java.util.Scanner;

public class MeowSample{
    public static void main(String[] args) {

    Scanner okay = new Scanner(System.in);
    System.out.println("Please enter a letter ");
    char letter = okay.next().charAt(0);
    //if(letter != 'x' || letter != 'y' || letter != 'z' || letter != 'q'){
    //    System.out.println("Errorrr");
    //}
    if(letter == 'x' || letter == 'y' || letter == 'z'|| letter == 'q'){ // this one is OK
        System.out.println("Correct!");
    } else { // <-- add the else
        System.out.println("Errorrr");  // Move the error print down here.
    }
}

如果 letter 是任何东西,您的原始代码将打印 "Error" - 不是 x、不是 y、不是 z 或不是 q。如果 letter 是 x、y、z 或 q,则您的原始代码将打印 "Correct"。

修改后的代码首先检查您想要的特定字母,然后如果 letter 不是您想要的,则在 else 块中打印错误。

问题是这种情况:

if(letter != 'x' || letter != 'y' || letter != 'z' || letter != 'q')

如果 letter 不是 'x' 或者 'y' 将 总是 为真,只是因为 letter 不能既 'x' 又 'y'。一些布尔代数表明:

l != 'x' || l != 'y' || ...
--> bracket NOT
!(l == 'x') || !(l == 'y') || ...
--> apply rule "!A || !B is equivalent to !(A && B)" (De Morgan 2)
!((l == 'x') && (l == 'y') && ...)

很明显 ((l == 'x') && (l == 'y') && ...) 将始终计算为 false,除非给出 'x' == 'y' - 它不是。应用 NOT 运算符,完整条件的最终结果将始终为 true.

此处正确的逻辑运算符是 &&

if(letter != 'x' && letter != 'y' && ...
如果 letter 既不是 'x',也不是 'y',也不是 ...,

只会评估为真。到目前为止如何解决问题本身。但总的来说,使用互斥条件的方法无论如何都会更优雅:

if(letter == 'x' || letter == 'y' || letter == 'z'|| letter == 'q'){
    System.out.println("Correct!");
}else{
    System.out.println("Errorrr");
}