所以我终于得到了我的代码:
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.在编译时到底发生了什么,是否有办法缩短我找到的解决方案?
这里的问题是
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.
| 归档时间: |
|
| 查看次数: |
113 次 |
| 最近记录: |