编写 if 语句的新方法

Posted

技术标签:

【中文标题】编写 if 语句的新方法【英文标题】:New way to write the if statement 【发布时间】:2012-06-22 16:28:12 【问题描述】:

在搜索网站的源代码时,我找到了一种以另一种方式(我认为)编写if 语句的方法。

代替:

if(a)b;

或:

a?b:'';

我读到了:

!a||b;

第三种方式和前两种方式一样吗?如果是,我们为什么要使用第三种方式?

【问题讨论】:

【参考方案1】:

布尔表达式的结果有时可以在不评估所有子表达式的情况下进行评估。如果我们有A||B,并且A 为真,则甚至不需要评估B,因为无论如何结果都会为真。这种行为称为“快捷布尔评估”,是大多数编程语言中的事实标准。它允许在不评估 A[i] 操作数的情况下编写 if (i < A.length && A[i] == ...) 之类的表达式,如果 i 值不正确,可能会导致异常。

在这种特殊情况下,!a||bif(a)b 相同,是的,但是这种代码的可读性和可维护性是一个问题。

【讨论】:

【参考方案2】:

欢迎来到short-circuit evaluation 的概念。这是在不同语言中使用的逻辑运算符的众所周知的属性。大多数情况下,这将用作正确的 if 或任何其他流控制语句中的子表达式,或者表达足够短的条件以便以这种方式保持可读性,或者通过自动转换来节省字节。

甚至还有关于这些问题的标签:short-circuiting。

【讨论】:

【参考方案3】:

第三种方式与前一种方式相同。使用它的一个论点是节省字节。反对使用它的一个强有力的论据是可读性。编写代码时最好注重可读性,并使用最小化器(例如Google Closure Compiler)来节省字节数。

它可以更短:

a && b;
/*  !a||b  means:
 (not a) OR b
    which is equivalent to
 a AND b
    which turns out to be
 a && b
*/

【讨论】:

(not false) or false 等价于false and false?真的吗? ) 您的 DeMorgan 生锈了,先生。 a && b 不等于 !a || b 逻辑上。但是,您说得对,a && b 仅在 a 为真时才评估 b。 @raina77ow 初始示例是if(a)b;,当a 为真时,这会导致评估bb 的结果无关紧要。 是的,但我想这更多的是关于短路而不是等效。 )

以上是关于编写 if 语句的新方法的主要内容,如果未能解决你的问题,请参考以下文章

调用post方法时,密码对应时进入if语句,但是我在if语句中的res被忽略了,为啥?

为 if else 语句编写单元测试

如何添加方法或编写此代码,以免重复多次?

构建 PL/SQL IF THEN 语句的更好方法?

geoTest 函数 - 创建 if/else 语句

如何在角度 9 中为多个 if else 语句编写测试用例