Java 为什么是!=在if语句的早期,它与if语句的结尾不一样吗?

Java 为什么是!=在if语句的早期,它与if语句的结尾不一样吗?,java,operator-precedence,Java,Operator Precedence,我不知道这两种if条件之间有什么区别。对我来说似乎是一样的 添加括号使其成为((字段[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 < n

我不知道这两种if条件之间有什么区别。对我来说似乎是一样的

添加括号使其成为
((字段[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
if(字段[i][j]!=-1&&i>=0&&i=0&&jif(字段[i][j]!=-1&&i>=0&&i=0&&j
不一样

if (0 <= i && i < numRows && 0 <= j && j < numCols && field[i][j] != -1){} //right version
if(0
if(字段[i][j]!=-1&&i>=0&&i=0&&j
不一样

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

如果(0
&&
是惰性运算符

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

这可能导致
a和&b
b和&a
之间存在差异


让我们看一下
a和
。在这种情况下
b
会产生副作用(就像在代码中抛出异常一样)。如果
a
的计算结果为
false
,那么
b
将根本不会被计算。

&
是惰性运算符

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

这可能导致
a和&b
b和&a
之间存在差异


让我们看一下
a和
。在这种情况下
b
会有副作用(就像在代码中抛出异常一样)。如果
a
的计算结果为
false
,那么
b
将根本不会被计算。

你到底有什么问题?你说错了,但错了为什么?错“错”有什么问题版本?它的行为如何不同?您可能会得到一个异常?当
i
j
小于0时,第一个可能会抛出
IndexOutOfBoundsException
,然后从左到右计算0个条件。如果任何条件失败,则
&
短路。因此,两个If(s)不相等。
&&
是一种短路操作,因此如果
i
j
超出范围,则在第二个版本中,
字段[i][j]
永远不会到达,因此不会出现异常。您的问题到底是什么?您说错了,但错了为什么?错误是什么问题版本?它的行为如何不同?您可能会得到一个异常?当
i
j
小于0时,第一个可能会抛出
IndexOutOfBoundsException
,然后从左到右计算0个条件。如果任何条件失败,则
&
短路。因此,两个If(s)不等效。
&
是一种短路操作,因此如果
i
j
超出范围,则在第二个版本中,
字段[i][j]
永远不会到达,因此不会引发异常