Hello亲爱的程序员,
我有一个字符串String input = "30.09.1993";
然后我想将这个字符串中的所有数字保存在一个数组中(只有数字!)。 “。”在索引2和5所以我想在我的循环中使用if语句跳过我的字符串的这些部分。
我解决了我的问题,一切正常,但我对&&
和||
运算符的逻辑感到困惑。
这是我的工作代码:
String input = "30.09.1993";
int[] eachNumbers = new int[8];
int x = 0;
for(int i = 0; i <= 9; i++){
if(i != 2 && i != 5){
eachNumbers[x] = Integer.parseInt(input.substring(i, i+1));
x++;
}
}
这是不起作用的代码:
String input = "30.09.1993";
int[] eachNumbers = new int[8];
int x = 0;
for(int i = 0; i <= 9; i++){
if(i != 2 || i != 5){
eachNumbers[x] = Integer.parseInt(input.substring(i, i+1));
x++;
}
}
这两个代码片段之间的唯一区别是if子句中的运算符。
我认为这些运营商的结果是:
&&
运营商:
false + false = false
true + false = false
false + true = false
true + true = true
||
运营商:
false + false = false
true + false = true
false + true = true
true + true = true
所以在我看来第二个代码片段应该可以工作,第一个应该抛出一个NumberFormatException
。但事实并非如此。
我确信现在有一些更好的解决方案,但我的问题只是关于if语句中的逻辑。有人能解释一下这背后的逻辑吗?我完全感到困惑,并感谢每一个有帮助的答案。
问候 Lukas Warsitz
答案 0 :(得分:7)
在第二个片段中,if子句将始终为true,因为i
将始终不是2或不是5(因为它不能同时为2和5)
对于你想要做的事情你的第一个片段很好,它完全符合你的要求:如果你不是第三个元素而不是第6个元素,你想要解析,否则你就是其中一个点在约会。
答案 1 :(得分:3)
关键点在于: In&amp;&amp;如果第一种情况是假的,则第二种情况不会检查。
true && false // Evaluates false because the second is false
false && true // Evaluates false because the first is false
true && true // Evaluates true because both are true
false && false // Evaluates false because the first is false
和
在||如果第一种情况属实,则第二种情况不会检查。
true || false // Evaluates true because the first is true
false || true // Evaluates true because the second is true
true || true // Evaluates true because the first is true
false || false // Evaluates false because both are false
答案 2 :(得分:3)
虽然不一定是LionC注意到的问题。
4和or逻辑运算符遵循以下逻辑:
&amp; 就像你描述的那样&amp;&amp;上方。
false + false = false
true + false = false
false + true = false
true + true = true
| 与上面的||
false + false = false
true + false = true
false + true = true
true + true = true
&安培;&安培;和||是快捷运算符,如果它对结果没有影响,则不测试第二个值。
&amp;&amp;
false + untested = false
true + false = false
false + untested = false
true + true = true
||
false + false = false
true + untested = true
false + true = true
true + untested = true
答案 3 :(得分:1)
您的第二个代码段不起作用,因为它应该是
if(i != 2 && i != 5)
并且您的第一个代码段没有抛出错误,原因与您使用过&amp;&amp;那里。
答案 4 :(得分:1)
选择一个号码任意数字。它不等于2,或者不等于5.
因此,表达式(i != 2 || i != 5)
可以静态地(由编译器)转换为仅true
并且整个if
控制结构被消除。
如果任何的字符不是数字,那么显而易见的结果是NumberFormatException
。
答案 5 :(得分:1)
我没有回答你的问题,但建议更好的代码。
public class splitToArray {
public static void main(String[] args) {
String input = "30.09.1993";
input = input.replace(".", " ");
String array[] = input.split(" ");
for(String value : array){
System.out.println(value);
}
}
}
Output:
30
09
1993
现在使用Integer.parseInt
获取整数值。当String input = "30.9.1993";
[0从09
]
答案 6 :(得分:1)
i
一次只能有一个值
因此,以下任何条件均有效:
if(i != 2 && i != 5) //means `i` is not any 2 AND i is not 5
或
if(i == 2 || i == 5) //means `i` is either 2 OR 5
注意:(i != 2 || i != 5)
始终为真,因为
- 如果i = 2,则LHS
i is not equal to 2
为FALSE且RHSi is not equal to 5
为TRUE- 如果i = 5,则LHS
i is not equal to 2
为TRUE且RHSi is not equal to 5
为FALSE- 对于i的所有其他值:LHS和RHS都是真的。
醇>