Zastanawiam się, czy to pytanie można rozwiązać w Javie (jestem nowy w tym języku). To jest kod:
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");
}
}
}
W moim laboratorium otrzymałem następujące pytanie: Jak można pominąć pierwszy przypadek (tj. Uczynić x == x
warunek fałszywym) bez modyfikowania samego warunku?
java
if-statement
Husam
źródło
źródło
System.out.println("Gotcha!");
zamiast komentarza? :).cross()
a drugi jest,.dot()
i nie ma zamieszania. Również fakt, że „nadpisuj operator == i zawsze zwracaj fałsz” nie może się zdarzyć, wydaje się pro javaOdpowiedzi:
Jednym prostym sposobem jest użycie
Float.NaN
:Możesz zrobić to samo z
Double.NaN
.Z JLS §15.21.1. Liczbowe operatory równości
==
i!=
:źródło
źródło
else
całkowicie usunąć . Technicznie rzecz biorąc, nie naruszyłoby to warunków pytania.Według specyfikacji języka Java
NaN
nie jest równaNaN
.Dlatego każda linia, która spowodowała, że
x
byłaby równaNaN
, spowodowałaby to, na przykładZe specyfikacji języka Java:
źródło
Nie jestem pewien, czy jest to opcja, ale zmiana
x
zmiennej lokalnej na pole umożliwiłaby innemu wątkowi zmianę wartości między odczytem lewej i prawej stronyif
instrukcji.Oto krótkie demo:
Wynik:
źródło
Zastąpiona linia mogła czytać.
Spowodowałoby to wydrukowanie gotcha.
Specyfikacja języka Java (JLS) mówi:
źródło
Udało mi się uzyskać
Gotcha!
z tego:źródło
a != a
został zmieniony przez inny wątek. Podejrzewam, że to dałoby punkty w wywiadzie.a
jest ona zmieniana przez pierwszy wątek pomiędzy pierwszym a drugim dostępem do porównaniaif
stwierdzenia, może być zapisane w jednej okropnej linii, jeśli to konieczneRozwiązań jest tak wiele:
źródło
super.println
powinno być „Nie w porządku”, prawda?Jednym prostym rozwiązaniem jest:
Ale nie znam wszystkich zasad tej zagadki ...
:) Wiem, że to oszustwo, ale bez znajomości wszystkich zasad to najłatwiejsze rozwiązanie na pytanie :)
źródło
if (System.out.println("Gotcha") && false)
Utwórz własną klasę
System
w tym samym pakiecie zCondition
.W takim przypadku Twoja
System
klasa ukryjejava.lang.System
klasęIdeone DEMO
źródło
Używając tego samego podejścia pomiń / zmień dane wyjściowe z innych odpowiedzi:
źródło