Java 这在任何情况下都有意义吗
我正在检查一个合作伙伴的代码,我发现了这个IF语句Java 这在任何情况下都有意义吗,java,if-statement,Java,If Statement,我正在检查一个合作伙伴的代码,我发现了这个IF语句 if (((x == 0) && (y == 0)) || y == 0) { do something } 如果我错了,请纠正我,但if的第一部分不是多余的吗?你是对的,它相当于 if (y == 0) { //do something } if (y == 0) { ... } 你可以画一张可能的作业表。我用1来表示任何不是0的整数 x y (((x ==
if (((x == 0) && (y == 0)) || y == 0) {
do something
}
如果我错了,请纠正我,但if的第一部分不是多余的吗?你是对的,它相当于
if (y == 0) {
//do something
}
if (y == 0) {
...
}
你可以画一张可能的作业表。我用1来表示任何不是0的整数
x y (((x == 0) && (y == 0)) || y == 0)
- - ----------------------------------
0 0 True
0 1 False
1 0 True
1 1 False
只有当y=0时,整个表达式的计算结果才为True,因此您可以将其重构为(y==0)您是对的,它相当于
if (y == 0) {
//do something
}
if (y == 0) {
...
}
你可以画一张可能的作业表。我用1来表示任何不是0的整数
x y (((x == 0) && (y == 0)) || y == 0)
- - ----------------------------------
0 0 True
0 1 False
1 0 True
1 1 False
只有当y=0时,整个表达式的计算结果才为True,因此您可以将其重构为(y==0)是的,第一部分是多余的。如果
y
为0
,则第二部分(在|
之后)将返回true
,而与x的值无关。这种情况可以简化为
if (y == 0) {
doSomething();
}
顺便说一句,值得注意的是,任何半体面的IDE都会警告您这种冗余,或者至少可以配置为这样做。如果没有收到这样的警告,最好检查IDE的设置。是的,第一部分是多余的。如果y
为0
,则第二部分(在|
之后)将返回true
,而与x的值无关。这种情况可以简化为
if (y == 0) {
doSomething();
}
顺便说一句,值得注意的是,任何半体面的IDE都会警告您这种冗余,或者至少可以配置为这样做。如果您没有收到这样的警告,最好检查IDE的设置。第一部分((x==0)和(&&(y==0))应该只在两边都为真时返回真。如果y==0,则后半部分为真。当只有x==0时,此if语句排除执行,但无论x是否等于0,都允许y等于0。只有当两边都为真时,第一部分((x==0)和&(y==0))才应返回真。如果y==0,则后半部分为真。当只有x==0时,此if语句排除执行,但无论x是否等于0,都允许y等于0。使用真值表:
╔════════╦════════╦══════════════════════════════════╗
║ x == 0 ║ y == 0 ║ ((x == 0) && (y == 0)) || y == 0 ║
╠════════╬════════╬══════════════════════════════════╣
║ 0 ║ 0 ║ 0 ║
║ 0 ║ 1 ║ 1 ║
║ 1 ║ 0 ║ 0 ║
║ 1 ║ 1 ║ 1 ║
╚════════╩════════╩══════════════════════════════════╝
使用真值表:
╔════════╦════════╦══════════════════════════════════╗
║ x == 0 ║ y == 0 ║ ((x == 0) && (y == 0)) || y == 0 ║
╠════════╬════════╬══════════════════════════════════╣
║ 0 ║ 0 ║ 0 ║
║ 0 ║ 1 ║ 1 ║
║ 1 ║ 0 ║ 0 ║
║ 1 ║ 1 ║ 1 ║
╚════════╩════════╩══════════════════════════════════╝
是的,在这种情况下它是多余的,因为所有条件都没有副作用,如果第一部分为真,那么第二部分为真
但是,如果该声明存在副作用,则由于短路,情况并非总是如此:
if( (doX() == 0 && doY() == 0) || doY() == 0 ) { ... }
在这种情况下,如果doX()
不返回0,则不会计算&
的右侧,因此doY()
将只执行一次。当doX()
返回0而第一个doY()
不返回0时,doY()
将执行两次。是的,在这种情况下它是多余的,因为没有任何条件有副作用,如果第一部分为真,第二部分为真
但是,如果该声明存在副作用,则由于短路,情况并非总是如此:
if( (doX() == 0 && doY() == 0) || doY() == 0 ) { ... }
在这种情况下,如果doX()
不返回0,则不会计算&
的右侧,因此doY()
将只执行一次。当doX()
返回0而第一个doY()
不返回0时,doY()
将执行两次。我建议使用单元测试
boolean isIt(int x, int y) {
if (((x == 0) && (y == 0)) || y == 0) {
return true;
}
return false;
}
@Test
public void test1() {
boolean result = isIt(1, 0);
assertTrue(result);
}
@Test
public void test1() {
boolean result = isIt(0, 0);
assertTrue(result);
}
然后,在运行测试并实现的第一部分后,如果不需要,可以删除它并再次运行测试以检查是否正确。我建议使用单元测试
boolean isIt(int x, int y) {
if (((x == 0) && (y == 0)) || y == 0) {
return true;
}
return false;
}
@Test
public void test1() {
boolean result = isIt(1, 0);
assertTrue(result);
}
@Test
public void test1() {
boolean result = isIt(0, 0);
assertTrue(result);
}
然后,在您运行测试并意识到的第一部分后,如果不需要,您可以删除它并再次运行测试以检查您是否正确。您知道吗?只要画一个表达式的真值表,包括和不包括if表达式的第一部分
让我们假设
a : x == 0
b : y == 0
c : a && b
d : (a && b) || b
因此,a、b、c和d的真值表如下所示
a | b | c | d |
----------------
0 | 0 | 0 | 0
----------------
0 | 1 | 0 | 1
----------------
1 | 0 | 0 | 0
----------------
1 | 1 | 1 | 1
从桌子上可以很容易地判断。我通常只使用卡诺图中的简化表达式。如果你们能做到这一点,就不会浪费时间争论了。你们知道吗?只要画一个表达式的真值表,包括和不包括if表达式的第一部分
让我们假设
a : x == 0
b : y == 0
c : a && b
d : (a && b) || b
因此,a、b、c和d的真值表如下所示
a | b | c | d |
----------------
0 | 0 | 0 | 0
----------------
0 | 1 | 0 | 1
----------------
1 | 0 | 0 | 0
----------------
1 | 1 | 1 | 1
从桌子上可以很容易地判断。我通常只使用卡诺图中的简化表达式。如果你们能做到这一点,就不会浪费时间争论了。这是打字错误吗?x和y代表什么?回到原来的要求。如果y!=0,则if将失败。如果y==0
,则If将通过。如果(y==0)
,那么它等于。请注意,此类问题应在审查时提出。stackexchange@DavidBrossard我不认为这是一个打字错误,更像是没有注意到这是一个打字错误吗?x和y代表什么?回到原来的要求。如果y!=0,则if将失败。如果y==0
,则If将通过。如果(y==0)
,那么它等于。请注意,此类问题应在审查时提出。stackexchange@DavidBrossard我不认为这是一个打字错误,更像是不注意问一个得分更高的stackoverflower:为什么我们不能把一个问题标记为“应该在codereview上”?:o@Nathan因为这一次不会,代码审查会导致太多错误迁移。谢谢!我很怀疑,因为这不是我的代码,我不想弄错,也许在他看来这是有道理的。谢谢guys@Mast事实上是这样,但给出了一些很好的解释:)@Nathan我是CR的常客,所以我对他们的范围了解一两点。由于多种原因,这个问题在那里最不受欢迎。请看一下这本书。我知道你链接的问题,还有很多其他类似的问题(如和)。长话短说:直接迁移路径不会发生