问题标签 [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 投票
8 回答
6891 浏览

php - 使用短路来获取第一个非空变量

PHP 中的以下内容(基于 JS 样式)的等价物是什么:

因此,如果故事存在,则发布;或者如果消息存在发布,等等......

0 投票
3 回答
203 浏览

compilation - 是否有编译器能够建议绝对需要程序员批准的优化?

如果我们让人类参与其中,编译器能否做的不仅仅是严格的语义等价优化?

编译器会直接忽略一些潜在的优化,因为它们在语义上可能不等效。

但是,它们也可能没问题,那么为什么不尝试检测并建议它们呢?检测可能涉及两个阶段的过程:编译时分析阶段和运行时分析阶段。

错误、警告和... 建议?

编译器已经对“警告”做了类似的事情,因为它们在每次编译期间都被汇集在一起​​,并且永远坐在列表中,直到您将它们解决给编译器满意为止。为什么没有“建议”或“建议的优化”部分以类似的方式运行,并有可能提高您的应用程序的性能?

如果编译器要分析布尔表达式的复杂性、估计的运行时间、单个操作数是真还是假的可能性等,那么它可以创建一个建议列表,例如表达式操作数的更好顺序,并呈现建议作为程序员的清单。然后,程序员可以单独处理它们,并决定忽略它们,或者让代码编辑器实现建议。

优化布尔表达式操作数顺序

考虑“短路逻辑表达式的优化”。因为操作数的顺序会影响哪个操作数可能被“短路”(即未调用),所以简单布尔表达式(即 A && B && C)中的操作数顺序是(我认为)编译器不会改变的东西如果任何操作数有副作用,则避免引入未知的副作用。

考虑一下:

由于比较一个字符是(更快/不太复杂),它应该放在表达式的第一位,这样短路逻辑可以避免在遇到逗号时调用 IsStringPresent。同样,在这种情况下,逗号(每行很多)会比换行序列更频繁地出现。

概括

客观地,可以根据“A 与 B 的错误触发短路的频率”和“计算 A 与 B 的成本,有利于更多昂贵的”。如果编译器可以在编译时、运行时或两者中确定其中任何一个的近似值,那么它可以确定一个特定的表达式可能是次优的,并且它可以为程序员创建一个建议的更改来实现.

今天有没有编译器做这样的事情?如果不是,为什么?

0 投票
1 回答
595 浏览

recursion - 短路运算符和尾递归

假设我有一个像这样的简单函数:

这个函数可以用更明显的尾递归风格重写,如下所示:

从逻辑上讲,两者之间的差异为零;假设bools仅包含TRUEFALSE(明智地定义),它们做的事情完全相同。

我的问题是:如果编译器足够聪明,可以将第二个优化为尾递归调用,那么考虑到“&&”短路,期望它以相同的方式优化第一个是否合理?显然,如果使用非短路运算符,这将不是尾递归,因为这两个表达式都将在运算符应用之前进行评估,但我对短路的情况很好奇。

(在我收到大量评论告诉我 C 编译器通常不优化尾递归调用之前:考虑这是一个关于使用短路运算符优化尾递归调用的一般问题,独立于语言。我会很高兴用 Scheme、Haskell、OCaml、F#、Python 重写它,或者如果你不懂 C,你会用什么别的什么东西。)

0 投票
7 回答
1338 浏览

php - 在 PHP 中打破多个函数(短路)

我想在 PHP 中返回多个嵌套函数。可以通过在“break”之后添加一个数字来打破多个循环。例如。

我可以在调用一系列函数时进行断路吗?

0 投票
2 回答
821 浏览

vb.net - LINQ 是否在 VB.NET 中进行短路评估?

我们Nullable object must have a value今天在这行代码上遇到了一个错误:

有趣的是,我确信这曾经可以正常工作(并且基础数据中总是有少量空值)。从逻辑上讲,它对我来说看起来不错。检查HasValueAndAlso 看起来好像他们将保护我们免受任何 Null 危险。

但似乎突然间他们不是了。我错过了什么吗?

好的,我们可以将其更正为这样,从而消除了错误:

但这在我看来不太可读。有什么想法吗?

更新...和忏悔
在简化上面的代码以缩短行时,我遗漏了代码的关键部分。最初的问题应该是这样的:

由于短路和运算符优先级的规则(如我自己很久以前的问题的答案中所述),我需要在指令的第二部分周围添加括号,以停止 LINQ 评估第二部分x.FooDate.Value.Date

感谢这两个答案都提供了快速测试代码来验证 LINQ 确实遵守 AndAlso 并迫使我更仔细地研究原始问题。

0 投票
3 回答
447 浏览

c++ - C++ 短路评估

也许我遗漏了一些相当简单的东西,但是当我取消引用指针时,即使我检查了表达式开头的点,我也会崩溃。

var1 是一个空指针,但 Var1->Dosomething() 仍在被调用。我的理解是 && 和 || C++ 中的运算符是短路的,所以如果 var1 为空,那么它将在一开始就终止。还是我还缺少其他东西?

0 投票
5 回答
1416 浏览

c# - 与 Math.Min 或 Math.Max 相比是否短路?

当与两个数字/函数的最小值或最大值进行比较时,如果第一个的情况为真并且第二个的情况为真,C# 是否会短路?这些情况的具体例子是

因为Math.Max(y, z())将返回一个至少与 y 一样大的值,如果 x < y 则不需要计算 z(),这可能需要一段时间。与 类似的情况Math.Min

我意识到这些都可以按照以下方式重写

为了短路,但我认为在不重写的情况下比较是什么更清楚。这是短路吗?

0 投票
3 回答
132 浏览

vb.net - 使用 iif() 进行集合初始化会引发 ArgumentNullException

谁能告诉我为什么这会在运行时出错:

我要ArgumentNullException上二线了。如果我将最后一部分替换为:

它可以工作 - 但是如果什么都没有,New List(Of String)(mightBeNothing)则永远不会调用构造函数mightBeNothing,那么问题是什么?

0 投票
1 回答
498 浏览

c# - 为什么短路运算符不是默认值

鉴于典型的编码口号是“不要在方法调用中引起副作用”。并且不使用短路运算符的唯一原因(我知道-如果我错了请赐教)是当您依赖后续代码中方法调用的副作用时。为什么 C# 和 VB.NET 等语言中的默认运算符不是短路版本?

IE:

实际上(默认情况下)意味着

0 投票
2 回答
203 浏览

java - 什么(在规范中)保证“非短路逻辑运算符实际上不会短路?

这是直接受到这个问题的启发。
有许多引用/声明,当应用于布尔值时,按位运算符不会短路。所以换句话说boolean a = f() & g(), wheref()bothg()返回布尔值,总是会被评估。 但是,JLS只说:

15.22.2 布尔逻辑运算符 &、^ 和 |
当 &、^ 或 | 的两个操作数 运算符的类型为 boolean 或 Boolean,则按位运算符表达式的类型为 boolean。在所有情况下,操作数都会根据需要进行拆箱转换(第 5.1.8 节)。

对于 &,如果两个操作数值都为真,则结果值为真;否则,结果为假。

对于 ^,如果操作数的值不同,则结果值为真;否则,结果为假。

对于 |,如果两个操作数的值都为假,则结果值为假;否则,结果为真。

这如何保证两个操作数都被实际评估?除了,如果其中一个参数(可能是第二个/正确的第一个被评估的)违反条件xor,您仍然可以中断并返回结果。 例如。只需要评估为假即可将表达式评估为假。 请注意:我不是在问它是否以这种方式实现(不会短路)-当然是这样。
a & bb

我在问:

用短路实现它会违反语言标准吗?