Java变量如何与自身不同?

2020/11/30 22:51 · java ·  · 0评论

我想知道这个问题是否可以用Java解决(我是该语言的新手)。这是代码:

class Condition {
    // you can change in the main
    public static void main(String[] args) { 
        int x = 0;
        if (x == x) {
            System.out.println("Ok");
        } else {
            System.out.println("Not ok");
        }
    }
}

我在实验室中收到以下问题:如何在x == x不修改条件本身的情况下跳过第一种情况(即使条件为假)?

一种简单的方法是使用Float.NaN

float x = Float.NaN;  // <--

if (x == x) {
    System.out.println("Ok");
} else {
    System.out.println("Not ok");
}
不好

您可以使用进行相同的操作Double.NaN


根据JLS§15.21.1。数值相等算子==!=

浮点相等性测试是根据IEEE 754标准的规则执行的:

  • 如果任一操作数为NaN,则结果为==为,false但结果!=true

    确实,测试x!=xtrue当且仅当xNa的值是。

...

int x = 0;
if (x == x) {
    System.out.println("Not ok");
} else {
    System.out.println("Ok");
}

Java语言规范 NaN不等于NaN

因此,任何x等于的行NaN都会导致此情况,例如

double x=Math.sqrt(-1);

从Java语言规范中:

浮点运算符不会产生任何异常(第11节)。溢出的操作将生成有符号无穷大,下溢的操作将生成非规范化的值或有符号的零,而无数学确定结果的操作将生成NaN。将NaN作为操作数的所有数值运算都会产生NaN。如前所述,NaN是无序的,因此涉及一个或两个NaN的数值比较操作返回false,而涉及NaN的任何!=比较都返回true,包括x!= x(当x为NaN时)。

不知道这是否是一个选项,但是x从局部变量更改为字段将允许其他线程在if语句的左侧和右侧之间更改其值

这是简短的演示:

class Test {

    static int x = 0;

    public static void main(String[] args) throws Exception {

        Thread t = new Thread(new Change());
        t.setDaemon(true);
        t.start();

        while (true) {
            if (x == x) {
                System.out.println("Ok");
            } else {
                System.out.println("Not ok");
                break;
            }
        }
    }
}

class Change implements Runnable {
    public void run() {
        while (true)
            Test.x++;
    }
}

输出:


Ok
Ok
Ok
Ok
Ok
Ok
Ok
Ok
Not ok

替换的行可以读取。

double x = Double.NaN;

这将导致陷阱被打印。

Java语言规范(JLS)说:

浮点运算符不会产生任何异常(第11节)。溢出的操作将产生有符号的无穷大,下溢的操作将产生非规范化的值或有符号的零,而数学上没有确定结果的操作将产生NaN。将NaN作为操作数的所有数值运算都会产生NaN。如前所述,NaN是无序的,因此涉及一个或两个NaN的数值比较操作返回false,而涉及NaN的任何!=比较都返回true,包括x!= x(当x为NaN时)。

我设法从中得到一个Gotcha!

volatile Object a = new Object();

class Flipper implements Runnable {
  Object b = new Object();

  public void run() {
    while (true)  {
      Object olda = a;
      a = b;
      a = olda;
    }
  }

}

public void test() {
  new Thread(new Flipper()).start();

  boolean gotcha = false;
  while (!gotcha) {
    // I've added everything above this - I would therefore say still legal.
    if (a == a) {
      System.out.println("Not yet...");
    } else {
      System.out.println("Gotcha!");
      // Uncomment this line when testing or you'll never terminate.
      //gotcha = true;
    }
  }
}

有很多解决方案:

class A extends PrintStream {
    public A(PrintStream x) {super(x);}
    public void println(String x) {super.println("Not ok");}
    public static void main(String[] args) {
        System.setOut(new A(System.out));
        int x = 0;
        if (x == x) {
            System.out.println("Ok");
        } else {
            System.out.println("Not ok");
        }
    }
}

一种简单的解决方案是:

System.out.println("Gotcha!");if(false)
if( a == a ){
  System.out.println("Not yet...");
} else {
  System.out.println("Gotcha!");
}

但是我不知道这个谜语的所有规则...

:)
我知道这是个骗子,但是不知道所有规则,这是问题的最简单解决方法:)

System在与相同的程序包中创建自己的类Condition

在这种情况下,您的
System课程将隐藏java.lang.System课程

class Condition
{
    static class System
    {
        static class out
        {
            static void println(String ignored)
            {
                java.lang.System.out.println("Not ok");
            }
        }
    }

    public static void main (String[] args) throws java.lang.Exception
    {
        int x = 0;
        if (x == x) 
        {
           System.out.println("Not ok");
        } 
        else 
        {
           System.out.println("Ok");
        }
    }
}  

Ideone演示

从另一个答案中使用相同的跳过/更改输出方法:

class Condition {
    public static void main(String[] args) {
        try {
            int x = 1 / 0;
            if (x == x) {
                System.out.println("Ok");
            } else {
                System.out.println("Not ok");
            }
        } catch (Exception e) {
            System.out.println("Not ok");
        }
    }
}
本文地址:http://java.askforanswer.com/javabianliangruheyuzishenbutong.html
文章标签: ,  
版权声明:本文为原创文章,版权归 admin 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!