我知道这可能是一个非常简单的问题,但我今天在一个项目的一些代码中遇到了这个问题。return 语句是如何工作的?这是什么操作?是不是类似于三级算子?
变量访问是一个int。
return access != IACL.RS_NOACCESS && documentVersion >= 0;
我知道这可能是一个非常简单的问题,但我今天在一个项目的一些代码中遇到了这个问题。return 语句是如何工作的?这是什么操作?是不是类似于三级算子?
变量访问是一个int。
return access != IACL.RS_NOACCESS && documentVersion >= 0;
让我们分解它,使用括号来明确逻辑分组:
return ((access != IACL.RS_NOACCESS) && (documentVersion >= 0));
因此,该方法返回一个布尔值,即执行比较的结果。在返回表达式的值之前评估整个表达式。
让我们假设access
等于IACL.RS_NOACCESS
和documentVersion
等于1
。然后该语句简化为:
return ((IACL.RS_NOACCESS != IACL.RS_NOACCESS) && (1 >= 0));
并且评估为:
return ((false) && (true));
并且评估为:
return false;
Ryan 在评论中指出的一个重要注意事项:逻辑运算符,如 && 和 || 在大多数情况下,在大多数语言中都是“短路”的。它们是在 Java 中的。这意味着评估从左到右进行。如果评估表达式的第二部分没有意义,则不会对其进行评估。
在上述情况下,由于表达式的第一部分计算结果为假,因此表达式的第二部分计算结果无关紧要 - 给定 AND 真值表,完整的表达式将始终计算结果为假。事实上,你可以有一个在右侧生成运行时错误的表达式——没关系。有了这些值,就永远不会运行右侧。
右边的整个表达式return
计算为一个布尔值,这就是返回的值。
return access != IACL.RS_NOACCESS && documentVersion >= 0;
相当于:
boolean result = (access != IACL.RS_NOACCESS);
result = result && (documentVersion >= 0);
return result;
这相当于:
boolean valid = access != IACL.RS_NOACCESS && documentVersion >= 0;
return valid;
它只是消除了变量,因为没有必要存储access != IACL.RS_NOACCESS && documentVersion >= 0
. 基本上是为了节省空间。