当前位置: 首页 > 面试题库 >

双重结构相等运算符:if(a == b == c)

林浩漫
2023-03-14
问题内容

我今天偶然地写了一些代码,当Eclipse一次不对我大吼时,我感到很惊讶。该代码对结构相等运算符(==)有双重使用,类似于下面的if(a==b==c)结构。

public class tripleEqual {
    public static void main(String[] args) {
        boolean[] a = { true, false };
        boolean[] b = { true, false };
        boolean[] c = { true, false };

        for (int aDex = 0; aDex < 2; aDex++) {
            for (int bDex = 0; bDex < 2; bDex++) {
                for (int cDex = 0; cDex < 2; cDex++) {
                    if (a[aDex] == b[bDex] == c[cDex]) {
                        System.out.printf("Got a==b==c with %d %d %d\n", aDex, bDex, cDex);
                    }
                }
            }
        }

    }
}

输出是

Got a==b==c with 0 0 0
Got a==b==c with 0 1 1
Got a==b==c with 1 0 1
Got a==b==c with 1 1 0

玩耍时,我注意到我if(a==b==c)除了不能使用任何类型boolean。从这个布尔表达式是

( A'. B'. C') + ( A'. B . C ) + ( A . B'. C ) + ( A . B . C')

简化为(A=B).'C + (A<>B).C

因此,忽略副作用if(a==b==c)等于if(a==b && !c) || (a!=b && c))

谁能解释该if(a==b==c)语法如何暗示这一点?

编辑1:

在许多人解释了左联想性之后,我发现我的困惑在哪里。通常,我将“ 1”表示为true,将“
0”表示为false,但是在上述测试中,我最小化的真值表/输出中,我将“ 0”表示为true,将“ 1”表示为false。表达式的取反( A'. B'. C') + ( A'. B . C ) + ( A . B'. C ) + ( A . B . C')(A=B)=C


问题答案:

随便玩耍,我注意到除了布尔值以外,我不能使用任何类型的if(a == b == c)。

您不能使用任何类型来执行此操作,但是boolean因为此比较链将从左侧到右侧进行评估。第一个比较将简化为truefalse必须与链中的第三个值进行比较的值(并且此检查的结果将与第四个值进行比较,依此类推,直到链的末尾)。至于原始值,您只能比较相同类型的原始值(例如boolean和boolean将起作用,而double和boolean将不起作用)-这就是为什么只能使用booleans的原因-
因为==返回的是相同的值输入为链中所有值。
这里存在危险:所有比较链的结果都不等于true您提供的所有值都等于时true。您可以从第二个输出中看到它:true== false==
false提高了true,如果您从左到右评估它(在程序执行过程中发生),这是正确的结果,但是如果 您认为 必须同时评估这个比较链,这
似乎是错误的 。正确的方法是两个执行两个显式比较: __

if (a == b && b == c) {
    // do something
}


 类似资料:
  • 我有两个双向量。双的值在-1000到1000之间。 两个向量包含相同的数字,但顺序不同。 例如 假设通过以下方式求和,是否可以保证向量1的和与向量2的和完全相等: 我担心双重不精确。

  • 本文向大家介绍if(a-b <0)和if(a 相关面试题,主要包含被问及if(a-b <0)和if(a 时的应答技巧和注意事项,需要的朋友参考一下 并且可能意味着两个不同的东西。考虑以下代码: 运行时,将仅打印。发生的事情显然是错误的,但是溢出并变为,这是负面的。 话虽如此,请考虑一下数组的长度确实接近。中的代码如下所示: 确实接近,所以(是)可能溢出并变成(即负数)。然后,将 下溢 相减回正数。

  • 问题内容: 我在Twitter上看到了这个Python代码段,并对输出感到困惑: 这里发生了什么? 问题答案: 从 Assignment语句 文档中 : 赋值语句评估表达式列表(请记住,它可以是单个表达式或逗号分隔的列表,后者产生一个元组),并将单个结果对象从左到右分配给每个目标列表。 您有两个分配目标列表;,和,该值从左到右分配给这两个目标。 首先,将元组解包到。您现在有和。注意这是可变的。 接

  • 与let命令类似,(( ... )) 结构允许对算术表达式的扩展和求值。它是let命令的简化形式。例如,a=$(( 5 + 3 )) 会将变量a赋值成 5 + 3,也就是8。在Bash中,双圆括号结构也允许以C风格的方式操作变量。例如,(( var++ ))。 样例 8-5. 以C风格的方式操作变量 #!/bin/bash # c-vars.sh # 以C风格的方式操作变量,使用(( ... ))

  • 我正在读费多尔·皮库斯的这本书,他有一些非常非常有趣的例子,对我来说是一个惊喜。 特别是这个基准抓住了我,唯一的区别是,在其中一个基准中,我们在if中使用||,在另一个基准中,我们使用|. 我不会详细介绍书中解释的为什么后者更快的所有细节,但我的想法是,在较慢的版本和|(按位或)版本中,硬件分支预测器有两次错误预测的机会。请参见下面的基准测试结果。 所以问题是为什么我们不在分支中总是使用|而不是|

  • shell脚本中的,有什么区别? 以下两者有什么区别吗? 仅仅是 和 仅在变量包含数字时才使用吗?