在PHP代码中 if(a() && b()) 当第一个操作数计算结果为false , b()将不会被评估。 同样,在 if (a() || b()) 当第一个操作数的计算结果为true , b()将不会被评估。 对于Java,C#等所有语言来说都是如此吗? 这是我们使用的testing代码。 <?php function a(){ echo 'a'; return false; } function b(){ echo 'b'; return true; } if(a() && b()){ echo 'c'; } ?>
我fix ,搞乱之后我碰到了一些奇怪的行为,即0 * undefined是*** Exception: Prelude.undefined和undefined * 0是0 。 这也意味着fix (0 *)是*** Exception: <<loop>>和fix (* 0)是0 。 玩过之后,似乎是因为在两个方向上进行短路并不是微不足道的,因为这没有什么意义,没有某种奇怪的平行计算,从第一个非平行计算开始,底部返回。 这种东西是否在其他地方出现(reflectionfunction不是底层价值的reflection),是我可以安全依靠的东西吗? 也有一个实际的方法,使(0 *)和(* 0)评估为零,无论传入的值。
我试图学习python,碰到一些代码很好但很短,但并不完全合理 背景是: def fn(*args): return len(args) and max(args)-min(args) 我得到它在做什么,但为什么python这样做 – 即返回值而不是真/假? 10 and 7-2 返回5。 这是合法/可靠的风格,还是有任何陷阱呢?
MATLAB中&和&&逻辑运算符有什么区别?
是的,这是一个家庭作业的问题,但我已经做了我的研究和相当深入的思考这个话题,并不能解决这个问题。 这个问题指出,这段代码不会performance出短路行为,并问为什么。 但在我看来,它确实performance出短路的行为,所以有人可以解释为什么它没有? 在C: int sc_and(int a, int b) { return a ? b : 0; } 在我看来,如果a是假的,程序根本不会去评估b ,但是我一定是错的。 为什么在这种情况下,程序甚至碰到b ,什么时候不需要?
我阅读了条件逻辑运算符 ||上的C#语言规范 和&&也被称为短路逻辑运算符。 对我来说,这似乎不清楚,如果这些存在可空布尔,即操作数typesNullable<bool> (也写bool? ),所以我尝试了与非dynamictypes: 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 […]
有时, if语句可能相当复杂或冗长,所以为了可读性,最好在if之前提取复杂的调用。 例如: if (SomeComplicatedFunctionCall() || OtherComplicatedFunctionCall()) { // do stuff } 进入这个 bool b1 = SomeComplicatedFunctionCall(); bool b2 = OtherComplicatedFunctionCall(); if (b1 || b2) { //do stuff } (提供的例子不是那么糟糕,只是为了说明…想象其他多个参数的调用等) 但是通过这个提取,我失去了短路评估(SCE)。 我真的每次都失去SCE吗? 是否有一些情况下编译器被允许“优化”,仍然提供SCE? 有没有方法保持第二个片段的可读性不会丢失SCE?
准备Oracleauthentication助理Java SE 8 Programmer 1考试,我在以下段落中看到官方学习指南中的三元expression: 三元expression评估 从Java 7开始,只有一个三元运算符的右边expression式将在运行时被评估。 以类似于短路运算符的方式,如果三元运算符中的两个右手expression式中的一个performance出副作用,那么它可能不会在运行时被应用。 我们用下面的例子来说明这个原理:[…] 它说只有两个expression式中的一个被评估,用下面的例子来演示: int y = 1; int z = 1; int a = y < 10 ? y++ : z++; 在这里,只有y增量,但是z并不如你所期望的那样。 我所踌躇的是这个段落的开头(用黄色标出),它表示“从Java 7开始……”。 我用Java 1.6testing了相同的代码,并且在行为上找不到差别。 我期望Java 1.6只是根据段落中给出的信息来评估这两个expression式。 有没有人有一个想法,他们想说“从Java 7,…”? 编辑:为了避免混淆:它归结为这样一个问题:自从他们编写“从Java 7开始”,从Java 6切换到Java 7时,是否有任何关于三元运算符的变化?
运算符&&和||短路行为 是程序员的一个惊人的工具。 但为什么他们在重载时会失去这种行为? 我明白操作符只是函数的语法糖,但是bool的操作符有这种行为,为什么只能限制在这种单一的types呢? 这背后有没有技术推理?
我应该使用什么构造来检查一个值在NULL模板中是否为NULL?