问题标签 [short-circuiting]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
5 回答
12709 浏览

sql - 相当于SQL中的VB AndAlso?

SQL (SQL Server 2005) 中是否有等效于 VB 的AndAlso/OrElse和 C# 的&&/ ||。我正在运行类似于以下内容的选择查询:

例如,如果“@a”参数作为 NULL 传入,则评估 WHERE 子句的第二部分 (a = @a) 没有意义。有没有办法通过使用特殊语法或重写查询来避免这种情况?

谢谢,詹姆斯。

0 投票
5 回答
375 浏览

c# - 这很有用,但我不确定它为什么有效

这个 C# 验证方法正是我想要的,但我不知道你可以像这样使用表达式短路。

当 propertyValue 为 null 时,执行是否仍需要评估表达式的第二部分以产生布尔结果,如果是这样,为什么第二部分不为Trim().Length > 0抛出 null ref 异常称呼?

我假设第二部分正在评估为 false 或 null,但我很想知道这里发生了什么。

抱歉,如果我遗漏了一些非常明显的东西,请赐教。

上帝 - 我错过了一些明显的白痴!- 当第一部分是假的时,第二部分是无关紧要的,我什至知道这是短循环的事实完全空白 - 很抱歉浪费人们的时间,尴尬的表情是什么?

添加了另一个标签以反映我在思考之前打字的尴尬。

0 投票
9 回答
3588 浏览

coding-style - 为什么要使用短路代码?

相关问题使用短路评估的好处为什么语言不使用短路评估?,有人可以解释一下这行代码吗?(逻辑和赋值运算符)

关于使用短路代码的语言的好处存在一些问题,但我想知道对程序员有什么好处?只是它可以让代码更简洁一点吗?还是有性能原因?

我不是在问无论如何都需要评估两个实体的情况,例如:

对我来说,推理很清楚 - 因为两者都需要为真,如果用户无法保存数据,您可以跳过成本更高的模型验证。

这也有一个(对我来说)明显的目的:

strlen()因为使用非字符串值调用是不明智的。

我想知道的是当它不影响任何其他语句时使用短路代码。例如,从 Zend Application 默认索引页面:

这可能是:

甚至作为一个单一的声明:

那么为什么要使用短路代码呢?只是为了使用逻辑运算符代替控制结构的“酷”因素?合并嵌套的 if 语句?因为它更快?

0 投票
2 回答
1824 浏览

sql-server - 是否对使用“OR”的 SQL SERVER 表达式的所有部分进行评估?

鉴于:

如果@Id 为空:表达式的计算结果为真。第二部分 @Id = Table.Id 是否仍然被考虑?或者考虑到第一部分是(c#中的情况),表达式计算为真就足够了。

这是相关的,因为有一些更复杂的 OR 语句,在这些语句中,了解是否所有部分都被评估很重要。


更新:

从那以后我发现这种语法是一个很好的选择

0 投票
8 回答
14119 浏览

c++ - 布尔值的 C++ 短路

我是 C++ 新手,很好奇编译器如何处理布尔值的惰性求值。例如,

如果 A 等于 1,是否曾经评估过 B==2 部分?

0 投票
7 回答
10404 浏览

java - Java短路评估

我认为 Java 有短路评估,但这一行仍然抛出空指针异常:

在这种情况下perfectAgentnull,所以我只希望整个表达式返回false,但我的应用程序仍然在这条线上崩溃,并出现 NullPointerException。

编辑,一般回应:

由于perfectAgentis null,不应该执行右边的任何内容&&,因为表达式不可能为真。更重要的是,它不可能执行,perfectAgent.getAddress()因为perfectAgent它不包含有效的引用(它是 null 和 all)。我正在尝试使用短路评估来不必在单独的语句中检查 null,因为这会使逻辑更加草率。

编辑 2(或者,我是个白痴):是的,就像生活中的许多事情一样,你在向世界宣布你是个白痴之后就会立即找到答案。在这种情况下,我在执行其他操作时关闭了 Eclipse 的自动构建并且没有重新打开它,因此我正在调试与我的源代码不匹配的类文件。

0 投票
3 回答
407 浏览

c# - 我可以在方法调用中强制自己短路吗?

假设我想检查一堆对象以确保没有一个为空:

编写一个辅助函数来接受可变数量的参数并简化这种检查是一个诱人的前景:

那么上面的代码可以变成:

对?错误的。如果obj为空,那么NullReferenceException当我尝试传递obj.ParametersNoNulls.

因此,上述方法显然是错误的。但是if使用运算符的语句&&工作得很好,因为它是短路的。那么:有没有办法使方法短路,以便在方法中明确引用之前不会评估其参数?

0 投票
4 回答
6263 浏览

objective-c - Objective-C 是否使用短路评估?

我尝试了一些类似的东西:

并得到:

-[NSNull 长度]:发送到实例的无法识别的选择器

第一个条件失败后Objective-C不会短路吗?

0 投票
6 回答
3468 浏览

sql-server - SQL查询执行快捷方式或逻辑?

我有三张桌子:

SmallTable最多有几十条记录。BigTable有几百万,实际上是一个视图,它将这个数据库中的一个表与同一服务器上另一个数据库中的一个表联合起来。

这是连接逻辑:

平均连接大小是几千个结果。显示的所有内容都已编入索引。

对于大多数SmallTable记录,flag1并且flag2设置为1,因此实际上甚至不需要访问 BigTable.text1 上的索引,但 SQL Server 无论如何都会这样做,从而导致代价高昂的索引扫描和嵌套循环。

有没有更好的方法来提示 SQL Server,如果flag1flag2都设置为1,它甚至不应该费心去看text1

实际上,如果我可以在这些情况下完全避免加入 BigTable(JoinTable 是托管的,所以这不会产生问题),那将使这个键查询更快。

0 投票
11 回答
17448 浏览

java - 为什么 Java 没有条件与和条件或运算符的复合赋值版本?(&&=, ||=)

所以对于布尔值的二元运算符,Java 有&, |, ^,&&||.

让我们在这里简要总结一下他们所做的事情:

对于&,结果值是true如果两个操作数值都是true; 否则,结果为false

对于|,结果值是false如果两个操作数值都是false; 否则,结果为true

对于^,结果值是true如果操作数值不同;否则,结果为false

&&运算符类似于但仅当&其左侧操作数的值为 时才计算其右侧操作数true

||运算符类似于,但仅当其|左侧操作数的值为 时才计算其右侧操作数false

现在,在所有 5 个中,其中 3 个具有复合赋值版本,|=&=^=。所以我的问题很明显:为什么 Java 不提供&&=||=?我发现我需要的比我需要的多&=,而且|=

而且我不认为“因为它太长”是一个好的答案,因为 Java 有>>>=. 这种遗漏一定有更好的理由。


15.26 赋值运算符

有12个赋值运算符;[...]= *= /= %= += -= <<= >>= >>>= &= ^= |=


有人评论说,如果&&=||=被实施,那么它将是唯一不首先评估右手边的运算符。我认为复合赋值运算符首先评估右手边的想法是错误的。

15.26.2 复合赋值运算符

形式的复合赋值表达式E1 op= E2等价于E1 = (T)((E1) op (E2)),其中T是 的类型E1,除了E1只计算一次。

作为证明,以下代码段抛出 a NullPointerException,而不是ArrayIndexOutOfBoundsException.