Hus*_*sam 106 java if-statement
我想知道这个问题是否可以用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");
}
}
}
Run Code Online (Sandbox Code Playgroud)
我在实验室收到了以下问题:如何在x == x不修改条件本身的情况下跳过第一种情况(即使条件为假)?
ars*_*jii 170
一种简单的方法是使用Float.NaN:
float x = Float.NaN; // <--
if (x == x) {
System.out.println("Ok");
} else {
System.out.println("Not ok");
}
Run Code Online (Sandbox Code Playgroud)
Not ok
你也可以这样做Double.NaN.
根据IEEE 754标准的规则执行浮点相等性测试:
如果任一操作数是NaN,则结果
==为false但是结果!=为true.实际上,测试
x!=x是true当且仅当值为xNaN时....
Jer*_*vel 157
int x = 0;
if (x == x) {
System.out.println("Not ok");
} else {
System.out.println("Ok");
}
Run Code Online (Sandbox Code Playgroud)
Ric*_*gle 147
由Java语言规范 NaN不等于NaN.
因此,任何导致x等于的行NaN都会导致这种情况,例如
double x=Math.sqrt(-1);
Run Code Online (Sandbox Code Playgroud)
从Java语言规范:
浮点运算符不会产生例外(第11节).溢出的操作产生有符号的无穷大,下溢的操作产生非规范化值或带符号的零,并且没有数学定义结果的操作产生NaN.以NaN作为操作数的所有数值运算都会产生NaN.如已经描述的那样,NaN是无序的,因此涉及一个或两个NaN的数字比较操作返回false,并且涉及NaN的任何!=比较返回true,包括当x是NaN时x!= x.
Psh*_*emo 73
不确定这是否是一个选项,但是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++;
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
?
Ok
Ok
Ok
Ok
Ok
Ok
Ok
Ok
Not ok
Run Code Online (Sandbox Code Playgroud)
小智 55
更换的行可以读取.
double x = Double.NaN;
Run Code Online (Sandbox Code Playgroud)
这将导致打印出来.
Java语言规范(JLS)说:
浮点运算符不会产生例外(第11节).溢出的操作产生有符号的无穷大,下溢的操作产生非规范化值或带符号的零,并且没有数学定义结果的操作产生NaN.以NaN作为操作数的所有数值运算都会产生NaN.如已经描述的那样,NaN是无序的,因此涉及一个或两个NaN的数字比较操作返回false,并且涉及NaN的任何!=比较返回true,包括当x是NaN时x!= x.
Old*_*eon 30
我设法得到了一个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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
Joh*_*uhn 25
有这么多解决方案:
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");
}
}
}
Run Code Online (Sandbox Code Playgroud)
Chr*_*ach 25
一个简单的解决方案是
System.out.println("Gotcha!");if(false)
if( a == a ){
System.out.println("Not yet...");
} else {
System.out.println("Gotcha!");
}
Run Code Online (Sandbox Code Playgroud)
但我不知道这个谜语的所有规则......
:) 我知道这是一个骗子,但不知道所有规则,这是问题的最简单的解决方案:)
Ily*_*lya 11
使用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");
}
}
}
Run Code Online (Sandbox Code Playgroud)
从另一个答案使用相同的跳过/更改输出方法:
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");
}
}
}
Run Code Online (Sandbox Code Playgroud)