问题标签 [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.
php - 使用短路来获取第一个非空变量
PHP 中的以下内容(基于 JS 样式)的等价物是什么:
因此,如果故事存在,则发布;或者如果消息存在发布,等等......
compilation - 是否有编译器能够建议绝对需要程序员批准的优化?
如果我们让人类参与其中,编译器能否做的不仅仅是严格的语义等价优化?
编译器会直接忽略一些潜在的优化,因为它们在语义上可能不等效。
但是,它们也可能没问题,那么为什么不尝试检测并建议它们呢?检测可能涉及两个阶段的过程:编译时分析阶段和运行时分析阶段。
错误、警告和... 建议?
编译器已经对“警告”做了类似的事情,因为它们在每次编译期间都被汇集在一起,并且永远坐在列表中,直到您将它们解决给编译器满意为止。为什么没有“建议”或“建议的优化”部分以类似的方式运行,并有可能提高您的应用程序的性能?
如果编译器要分析布尔表达式的复杂性、估计的运行时间、单个操作数是真还是假的可能性等,那么它可以创建一个建议列表,例如表达式操作数的更好顺序,并呈现建议作为程序员的清单。然后,程序员可以单独处理它们,并决定忽略它们,或者让代码编辑器实现建议。
优化布尔表达式操作数顺序
考虑“短路逻辑表达式的优化”。因为操作数的顺序会影响哪个操作数可能被“短路”(即未调用),所以简单布尔表达式(即 A && B && C)中的操作数顺序是(我认为)编译器不会改变的东西如果任何操作数有副作用,则避免引入未知的副作用。
考虑一下:
由于比较一个字符是(更快/不太复杂),它应该放在表达式的第一位,这样短路逻辑可以避免在遇到逗号时调用 IsStringPresent。同样,在这种情况下,逗号(每行很多)会比换行序列更频繁地出现。
概括
客观地,可以根据“A 与 B 的错误触发短路的频率”和“计算 A 与 B 的成本,有利于更多昂贵的”。如果编译器可以在编译时、运行时或两者中确定其中任何一个的近似值,那么它可以确定一个特定的表达式可能是次优的,并且它可以为程序员创建一个建议的更改来实现.
今天有没有编译器做这样的事情?如果不是,为什么?
recursion - 短路运算符和尾递归
假设我有一个像这样的简单函数:
这个函数可以用更明显的尾递归风格重写,如下所示:
从逻辑上讲,两者之间的差异为零;假设bools
仅包含TRUE
或FALSE
(明智地定义),它们做的事情完全相同。
我的问题是:如果编译器足够聪明,可以将第二个优化为尾递归调用,那么考虑到“&&”短路,期望它以相同的方式优化第一个是否合理?显然,如果使用非短路运算符,这将不是尾递归,因为这两个表达式都将在运算符应用之前进行评估,但我对短路的情况很好奇。
(在我收到大量评论告诉我 C 编译器通常不优化尾递归调用之前:考虑这是一个关于使用短路运算符优化尾递归调用的一般问题,独立于语言。我会很高兴用 Scheme、Haskell、OCaml、F#、Python 重写它,或者如果你不懂 C,你会用什么别的什么东西。)
php - 在 PHP 中打破多个函数(短路)
我想在 PHP 中返回多个嵌套函数。可以通过在“break”之后添加一个数字来打破多个循环。例如。
我可以在调用一系列函数时进行断路吗?
vb.net - LINQ 是否在 VB.NET 中进行短路评估?
我们Nullable object must have a value
今天在这行代码上遇到了一个错误:
有趣的是,我确信这曾经可以正常工作(并且基础数据中总是有少量空值)。从逻辑上讲,它对我来说看起来不错。检查HasValue
和AndAlso
看起来好像他们将保护我们免受任何 Null 危险。
但似乎突然间他们不是了。我错过了什么吗?
好的,我们可以将其更正为这样,从而消除了错误:
但这在我看来不太可读。有什么想法吗?
更新...和忏悔:
在简化上面的代码以缩短行时,我遗漏了代码的关键部分。最初的问题应该是这样的:
由于短路和运算符优先级的规则(如我自己很久以前的问题的答案中所述),我需要在指令的第二部分周围添加括号,以停止 LINQ 评估第二部分x.FooDate.Value.Date
:
感谢这两个答案都提供了快速测试代码来验证 LINQ 确实遵守 AndAlso 并迫使我更仔细地研究原始问题。
c++ - C++ 短路评估
也许我遗漏了一些相当简单的东西,但是当我取消引用指针时,即使我检查了表达式开头的点,我也会崩溃。
var1 是一个空指针,但 Var1->Dosomething() 仍在被调用。我的理解是 && 和 || C++ 中的运算符是短路的,所以如果 var1 为空,那么它将在一开始就终止。还是我还缺少其他东西?
c# - 与 Math.Min 或 Math.Max 相比是否短路?
当与两个数字/函数的最小值或最大值进行比较时,如果第一个的情况为真并且第二个的情况为真,C# 是否会短路?这些情况的具体例子是
和
因为Math.Max(y, z())
将返回一个至少与 y 一样大的值,如果 x < y 则不需要计算 z(),这可能需要一段时间。与 类似的情况Math.Min
。
我意识到这些都可以按照以下方式重写
为了短路,但我认为在不重写的情况下比较是什么更清楚。这是短路吗?
vb.net - 使用 iif() 进行集合初始化会引发 ArgumentNullException
谁能告诉我为什么这会在运行时出错:
我要ArgumentNullException
上二线了。如果我将最后一部分替换为:
它可以工作 - 但是如果什么都没有,New List(Of String)(mightBeNothing)
则永远不会调用构造函数mightBeNothing
,那么问题是什么?
c# - 为什么短路运算符不是默认值
鉴于典型的编码口号是“不要在方法调用中引起副作用”。并且不使用短路运算符的唯一原因(我知道-如果我错了请赐教)是当您依赖后续代码中方法调用的副作用时。为什么 C# 和 VB.NET 等语言中的默认运算符不是短路版本?
IE:
实际上(默认情况下)意味着
java - 什么(在规范中)保证“非短路逻辑运算符实际上不会短路?
这是直接受到这个问题的启发。
有许多引用/声明,当应用于布尔值时,按位运算符不会短路。所以换句话说boolean a = f() & g()
, wheref()
和bothg()
返回布尔值,总是会被评估。
但是,JLS只说:
15.22.2 布尔逻辑运算符 &、^ 和 |
当 &、^ 或 | 的两个操作数 运算符的类型为 boolean 或 Boolean,则按位运算符表达式的类型为 boolean。在所有情况下,操作数都会根据需要进行拆箱转换(第 5.1.8 节)。对于 &,如果两个操作数值都为真,则结果值为真;否则,结果为假。
对于 ^,如果操作数的值不同,则结果值为真;否则,结果为假。
对于 |,如果两个操作数的值都为假,则结果值为假;否则,结果为真。
这如何保证两个操作数都被实际评估?除了,如果其中一个参数(可能是第二个/正确的第一个被评估的)违反条件xor
,您仍然可以中断并返回结果。
例如。只需要评估为假即可将表达式评估为假。
请注意:我不是在问它是否以这种方式实现(不会短路)-当然是这样。a & b
b
我在问:
用短路实现它会违反语言标准吗?