0

Java の演算子==は、プリミティブ値に対して非対称できますか?x == yy != xxy

編集:

わかりました、私が尋ねる理由を正直に言います。Java Puzzlers bookには==、プリミティブ型の演算子に関するこのパズル #87 があります。

==これには 3 つの部分があり、1 つは演算子が内省的でないケースを見つけるように読者に要求し、2 番目はオペレーターが==推移的でないケースを見つけるためのものです。両方の解決策を見つけましたが、次のように定義されている3番目の解決策を解決する方法がわかりません:

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

平等と比較のための特別な値はいくつかあります。これらは、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は==0.0ですが、compareTo(-0.0、0.0)の場合は-1を返します
于 2012-06-19T20:33:56.820 に答える
4

いいえ。すべてのプリミティブについて、== 記号は交換可能です。あれは、

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

于 2012-06-19T17:48:05.590 に答える
4

==すべてのタイプで対称です...

仕様から:

オペランド式に副作用がない場合、等価演算子は交換可能です。

于 2012-06-19T17:51:34.377 に答える
2

これがプリミティブ型に当てはまるケースは知りません。

于 2012-06-19T17:47:25.077 に答える