使用较短版本或"||" 在带有整数和数学/逻辑错误的If语句中?

Pau*_*aul 2 java if-statement

所以我终于得到了我的代码:

if((choice == 1 ) || (choice == 2) || (choice == 3) || (choice == 4)){
Run Code Online (Sandbox Code Playgroud)

但为什么:

if(choice == (1 | 2)) {
Run Code Online (Sandbox Code Playgroud)

导致逻辑/数学错误?例如,如果我输入"3",则代码接受它并将其处理为成功.代码段如下:

while(counter == 0){
        try{
            int choice = Integer.parseInt(input.nextLine());

            if(choice == (1 | 2)){
                System.out.println("You got it!");
                ++counter;
            }else{
                System.out.println("Try again");
            }
        }
        catch(NumberFormatException Exception){
            System.out.println("You did something wrong");
        }


    }
Run Code Online (Sandbox Code Playgroud)

如果我这样做:

if(choice == (1 | 2 | 3 | 4 )){
Run Code Online (Sandbox Code Playgroud)

那么就我所知,它只会接受7.在编译时到底发生了什么,是否有办法缩短我找到的解决方案?

tem*_*def 8

这里的问题是

if (choice == (1 | 2)) { ... }
Run Code Online (Sandbox Code Playgroud)

并不意味着"如果choice等于1或等于2,那么......".相反,Java将其解释1 | 2为"两个数字1和2的按位OR",因为单个垂直条表示按位OR运算符.如果你取1和2的按位OR,你得到数字3(如果你知道二进制数,看看你能否确认为什么会这样),所以你的if语句完全等同于

if (choice == 3) { ... }
Run Code Online (Sandbox Code Playgroud)

这就是你看到你所看到的行为的原因.

同样,如果你写

if (choice == (1 | 2 | 3 | 4)) { ... }
Run Code Online (Sandbox Code Playgroud)

Java将表达式解释1 | 2 | 3 | 4为"数字1,2,3和4的按位OR",其结果为7.

如果你有一组值,并且你想测试一个特定值是否等于这些值中的任何一个,正如你所指出的那样,有一个选项是进行一系列独立的相等测试.如果您有非常多的值,您可能希望使用类似的东西HashSet.

  • 为什么选择downvote?这是一个正确而且写得很好的答案. (3认同)