Java 这在任何情况下都有意义吗

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语句

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的常客,所以我对他们的范围了解一两点。由于多种原因,这个问题在那里最不受欢迎。请看一下这本书。我知道你链接的问题,还有很多其他类似的问题(如和)。长话短说:直接迁移路径不会发生