Can Java';s==运算符对于基元值是否不对称?

Can Java';s==运算符对于基元值是否不对称?,java,identity,Java,Identity,Java的=操作符是否可以对原语的值进行不对称,从而x==y,但是y!=x,其中x和y都是一些(可能不同的)基元类型的变量 编辑: 好吧,我会诚实地告诉你我问的原因。在中,有一个谜题#87,它涉及原语类型的=运算符 它有三个部分,一是让读者找到==运算符不可反射的情况,二是找到=不可传递的情况。我已经找到了这两个问题的解决方案,但我不知道如何解决第三个问题,定义如下: public class Symmetric { public static void main(String[] ar

Java的
=
操作符是否可以对原语的值进行不对称,从而
x==y
,但是
y!=x
,其中
x
y
都是一些(可能不同的)基元类型的变量

编辑:

好吧,我会诚实地告诉你我问的原因。在中,有一个谜题#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);
    }
}
公共类对称{
公共静态void main(字符串[]args)引发异常{
/*
*如果你能想出一组基本类型和值
*这会导致该程序打印“true false”,然后
*您已经证明了==运算符不是对称的。
*/
x=;
y=;
System.out.print((x==y)+“”);
System.out.println(y==x);
}
}

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

我不知道在任何情况下,这对基本类型是正确的。

否。对于所有基本类型,==符号都是。就是


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

==
对于每个类型都是对称的

根据规范:

如果操作数表达式没有边,则相等运算符是可交换的 效果


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

它们之所以特别,是因为它们没有遵循一些关于相等或比较的正常规则

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();
}
publicstaticvoidmain(字符串…参数){
打印比较(“Float.NaN”,Float.NaN);
打印比较(“Double.NaN”,Double.NaN);
打印比较(“-0.0f”、-0.0f);
打印比较(“-0.0”、-0.0);
}
私有静态void打印比较(字符串描述、浮点v){
System.out.println(“[”+desc+“]);
System.out.println(v+“=”+v+”是“+(v==v));
System.out.println(v+“!=”+v+“是”+(v!=v));
System.out.println(v+“==0.0是”+(v==0.0));
System.out.println(v+“<0是”+(v<0));
System.out.println(v++>0为“+(v>0));
System.out.println(“Float.compareTo(“+v+”,0)是“+Float.compare(v,0));
System.out.println();
}
私有静态void打印比较(字符串描述,双v){
System.out.println(“[”+desc+“]);
System.out.println(v+“=”+v+”是“+(v==v));
System.out.println(v+“!=”+v+“是”+(v!=v));
System.out.println(v+“==0.0是”+(v==0.0));
System.out.println(v+“<0是”+(v<0));
System.out.println(v++>0为“+(v>0));
System.out.println(“Double.compareTo(“+v+”,0)是“+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
[Float.NaN]
NaN==NaN为false
南!=南是真的
NaN==0.0为假
NaN<0是错误的
NaN>0为假
Float.compareTo(NaN,0)是1
[Double.NaN]
NaN==NaN为false
南!=南是真的
NaN==0.0为假
NaN<0是错误的
NaN>0为假
双精度。比较(NaN,0)是1
[-0.0f]
-0.0==-0.0为真
-0.0 != -0.0是错误的
-0.0==0.0为真
-0.0<0为假
-0.0>0为假
Float.compareTo(-0.0,0)是-1
[ -0.0 ]
-0.0==-0.0为真
-0.0 != -0.0是错误的
-0.0==0.0为真
-0.0<0为假
-0.0>0为假
Double.compareTo(-0.0,0)是-1
总之


  • NaN不是>、=或否,它不能用于基本类型。请注意,您描述的是一种双向关系。你是说‘但不是y==x’?@大卫:没错。==运算符在这种情况下是对称的。此外,对于非原语也不能是不对称的。当然,.equals()可能是不对称的。为什么人们会如此小心地表示原始类型。。。在哪种情况下,
    ==
    是不对称的?对于每种类型都应该是对称的。一个愚蠢的人可以定义一个不是的覆盖。@Wug在Java中没有办法做到这一点。@Wug:从你的标签上看,它似乎是[Java]本身:P你得到了非常大的样本量:对我来说,这个词听起来是正确的。在数学中,如果改变操作数的顺序不改变结果,则二进制运算是可交换的