我无法弄清楚这两个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
答案 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 && b
和b && a
之间的差异。
让我们看看a && b
。在这种情况下,b
会产生副作用(如在您的代码中引发异常)。如果将a
评估为false
,则根本不会评估b
。