为什么!=在if语句的开头与结尾处的不一样?

时间:2019-01-07 03:10:32

标签: java operator-precedence

我无法弄清楚这两个if条件之间的区别。对我来说似乎一样。

添加括号以使其为((field[i][j] != -1)也不会更改任何内容。

if (field[i][j] != -1 && i>=0 && i< numRows && j >= 0 && j < numCols){} 
//wrong version 
is NOT the same as 
if (0 <= i && i < numRows && 0 <= j && j < numCols && field[i][j] != -1){}
//right version

2 个答案:

答案 0 :(得分:9)

if (field[i][j] != -1 && i>=0 && i< numRows && j >= 0 && j < numCols){} //wrong version 

不同
if (0 <= i && i < numRows && 0 <= j && j < numCols && field[i][j] != -1){} //right version

没有看到其他代码,这很难说。 &&短路(Short circuit evaluation)意味着代码将在false出现时立即停止运行。在正确的版本中,我猜测在最终到达field[i][j] != -1之前,布尔检查之一是假的。可能发生了某种边界异常。

答案 1 :(得分:3)

&&是惰性运算符。

如果左侧被评估为false,则无需评估右侧,因为已经知道整个操作的结果。

这可能会导致a && bb && a之间的差异。

让我们看看a && b。在这种情况下,b会产生副作用(如在您的代码中引发异常)。如果将a评估为false,则根本不会评估b