Questions tagged «short-circuiting»

某些语言的功能,可以在运行时跳过某些不影响结果的代码,尤其是在测试复合条件时





14
是否对SQL WHERE子句进行了短路评估?
是否在SQL WHERE子句中对布尔表达式进行短路求值 ? 例如: SELECT * FROM Table t WHERE @key IS NULL OR (@key IS NOT NULL AND @key = t.Key) 如果@key IS NULL的计算结果为true,则@key不是NOT AND @key = t.Key的计算结果吗? 如果否,为什么不呢? 如果是,是否可以保证?它是ANSI SQL的一部分还是特定于数据库的? 如果数据库特定,SqlServer?甲骨文?MySQL的?

7
是否必须使逻辑运算符短路?和评估顺序?
ANSI标准是否要求在C或C ++中使逻辑运算符短路? 我很困惑,因为我回想起K&R的书,说您的代码不应该依赖这些操作的短路,因为它们可能不是。有人可以指出标准中逻辑运算总是短路的地方吗?我对C ++最为感兴趣,对于C的回答也很好。 我还记得读(不记得在哪里)未严格定义评估顺序,因此您的代码不应依赖或假定表达式中的函数将按特定顺序执行:在语句末尾,所有引用的函数会被调用,但是编译器可以自由选择最有效的顺序。 标准是否指示此表达式的评估顺序? if( functionA() && functionB() && functionC() ) cout<<"Hello world";


2
从Java 7开始,Java中的三元运算符仅评估一个表达式-Java 1.6和更低版本中的表达式不同吗?
在准备Oracle认证Java SE 8程序员1认证考试时,我在官方学习指南中遇到了有关三元表达式的以下段落: 三元表达式评估 从Java 7开始,将仅在运行时评估三元运算符的右侧表达式之一。以类似于短路运算符的方式,如果三元运算符中的两个右手表达式之一执行了副作用,那么它可能不会在运行时应用。让我们通过以下示例来说明这一原理:[...] 它说仅对两个表达式之一进行求值,并通过以下示例进行演示: int y = 1; int z = 1; int a = y < 10 ? y++ : z++; 在这里,仅y增加,但z没有增加,正如您期望的那样。 我遇到的是该段落的开头(以黄色标记),该段落的内容为“从Java 7开始,...”。我使用Java 1.6测试了相同的代码,但在行为上没有发现差异。我希望Java 1.6仅根据本段给出的信息来评估这两个表达式。有谁知道他们想对“从Java 7开始...”说什么? 编辑:为避免混淆:归结为一个问题,因为他们编写了“从Java 7开始”,从Java 6切换到Java 7时,关于三元运算符有什么变化吗?



10
if语句-短路评估与可读性
有时,一条if语句可能相当复杂或冗长,因此,为了便于阅读,最好在之前提取复杂的调用if。 例如: if (SomeComplicatedFunctionCall() || OtherComplicatedFunctionCall()) { // do stuff } 进入这个 bool b1 = SomeComplicatedFunctionCall(); bool b2 = OtherComplicatedFunctionCall(); if (b1 || b2) { //do stuff } (提供的示例并没有那么糟糕,它只是为了说明……想象一下具有多个参数的其他调用,等等。) 但是通过这种提取,我失去了短路评估(SCE)。 我真的每次都会失去SCE吗?在某些情况下,允许编译器“对其进行优化”并仍然提供SCE吗? 有没有办法在不丢失SCE的情况下提高第二个片段的可读性?

3
做短路操作员|| 和&&是否存在可为空的布尔值?RuntimeBinder有时会这样认为
我阅读了有关条件逻辑运算符 ||和的C#语言规范&&,也称为短路逻辑运算符。对我来说,似乎还不清楚这些是否存在可空布尔值,即操作数类型Nullable<bool>(也写为bool?),因此我尝试使用非动态类型: bool a = true; bool? b = null; bool? xxxx = b || a; // compile-time error, || can't be applied to these types 这似乎解决了这个问题(我无法清楚地理解规范,但是现在我知道,假设Visual C#编译器的实现是正确的)。 但是,我也想尝试dynamic绑定。所以我尝试这样做: static class Program { static dynamic A { get { Console.WriteLine("'A' evaluated"); return true; } } static dynamic B { get …

12
Java为什么没有条件和和条件或运算符的复合赋值版本?(&& =,|| =)
因此,对于在布尔二元运算符,Java有&,|,^,&&和||。 让我们在这里简要总结一下他们的工作: JLS 15.22.2布尔逻辑运算符&,^和| JLS 15.23条件与运算符&& JLS 15.24条件或运算符|| 对于&,结果值是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仅被评估一次。 为了证明这一点,以下代码段抛出NullPointerException,而不是ArrayIndexOutOfBoundsException。 int[] a = null; int[] b = {}; a[0] += …

6
为什么C中的此逻辑AND版本没有显示短路行为?
是的,这是一个家庭作业问题,但是我已经完成了我的研究并且对这个主题进行了大量的深入思考,无法解决。问题指出,这段代码没有表现出短路行为,并询问原因。但是在我看来,它确实表现出短路行为,所以有人可以解释为什么不这样做吗? 在C中: int sc_and(int a, int b) { return a ? b : 0; } 在我看来,在a错误的情况下,该程序根本不会尝试评估b,但我一定是错的。b在这种情况下,为什么程序在不需要的情况下甚至可以触摸?

3
在Twig中,检查数组的特定键是否存在
在PHP中,我们可以使用函数检查数组中是否存在键array_key_exists()。 在Twig模板语言中,我们可以简单地使用一条if语句来检查变量或对象的属性是否存在,如下所示: {% if app.user %} do something here {% else %} do something else {% endif %} 但是,我们如何使用Twig检查数组的键是否存在?我试过了{% if array.key %},但是给了我一个错误: Key "key" for array with keys "0, 1, 2, 3...648" does not exist 由于将数据传递到模板的主要方法之一是使用数组,因此似乎应该有某种方法可以做到这一点。有什么想法吗?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.