0

Java 的==运算符对于原始值是否可以是不对称的,所以, 但是, where和都是一些(可能不同的)原始类型的变量?x == yy != xxy

编辑:

好吧,我会诚实地说我问的原因。在Java Puzzlers book中,有一个谜题 #87,它涉及==原始类型的运算符。

它分为三个部分,一是挑战读者找到==算子不具有反射性的情况,二是寻找不及物的情况==。我已经找到了他们两个的解决方案,但我不知道如何解决第三个问题,它的定义如下:

public class Symmetric {
    public static void main(String[] args) throws Exception {
        /*
         * If you can come up with a set of primitive types and values
         * that causes this program to print "true false", then
         * you have proven that the == operator is not symmetric.
         */
        <typeX> x = <valueX>;
        <typeY> y = <valueY>;

        System.out.print ((x == y) + " ");
        System.out.println(y == x);
    }
}

我不拥有这本书,所以我无法查找解决方案,我只找到了不包含解决方案的源文件。

4

4 回答 4

4

不。对于所有原语, == 符号是可交换的。那是,

(x == y) => (y == x)

于 2012-06-19T17:48:05.590 回答
4

==对每种类型都是对称的...

从规范:

如果操作数表达式没有副作用,则等式运算符是可交换的。

于 2012-06-19T17:51:34.377 回答
4

只有几个特殊值用于相等和比较。它们是 Float.NaN、Double.NaN、-0.0f 和 -0.0。

这些特殊的原因是它们不遵循一些正常的相等或 compareTo 规则

public static void main(String... args) {
    printComparisons("Float.NaN", Float.NaN);
    printComparisons("Double.NaN", Double.NaN);
    printComparisons("-0.0f", -0.0f);
    printComparisons("-0.0", -0.0);
}

private static void printComparisons(String desc, float v) {
    System.out.println("[ " + desc + " ]");
    System.out.println(v + " == " + v + " is " + (v == v));
    System.out.println(v + " != " + v + " is " + (v != v));
    System.out.println(v + " == 0.0  is " + (v == 0.0));
    System.out.println(v + " < 0 is " + (v < 0));
    System.out.println(v + " > 0 is " + (v > 0));
    System.out.println("Float.compareTo(" + v + ", 0) is " + Float.compare(v, 0));
    System.out.println();
}

private static void printComparisons(String desc, double v) {
    System.out.println("[ " + desc + " ]");
    System.out.println(v + " == " + v + " is " + (v == v));
    System.out.println(v + " != " + v + " is " + (v != v));
    System.out.println(v + " == 0.0  is " + (v == 0.0));
    System.out.println(v + " < 0 is " + (v < 0));
    System.out.println(v + " > 0 is " + (v > 0));
    System.out.println("Double.compareTo(" + v + ", 0) is " + Double.compare(v, 0));
    System.out.println();
}

印刷

[ Float.NaN ]
NaN == NaN is false
NaN != NaN is true
NaN == 0.0  is false
NaN < 0 is false
NaN > 0 is false
Float.compareTo(NaN, 0) is 1

[ Double.NaN ]
NaN == NaN is false
NaN != NaN is true
NaN == 0.0  is false
NaN < 0 is false
NaN > 0 is false
Double.compareTo(NaN, 0) is 1

[ -0.0f ]
-0.0 == -0.0 is true
-0.0 != -0.0 is false
-0.0 == 0.0  is true
-0.0 < 0 is false
-0.0 > 0 is false
Float.compareTo(-0.0, 0) is -1

[ -0.0 ]
-0.0 == -0.0 is true
-0.0 != -0.0 is false
-0.0 == 0.0  is true
-0.0 < 0 is false
-0.0 > 0 is false
Double.compareTo(-0.0, 0) is -1

总之。

  • NaN 不是 >、<、==、>= 或 <= 0.0,而是compareTo(NaN,0)返回 1
  • 0.0 is == 0.0 but for compareTo(-0.0, 0.0) return -1
于 2012-06-19T20:33:56.820 回答
2

我不知道任何情况下对于原始类型都是如此。

于 2012-06-19T17:47:25.077 回答