Jak należy rozumieć zachowanie kompilatora Java?Nieosiągalne oświadczenie: while true vs if true
while (true) return;
System.out.println("I love Java");
// Err: unreachable statement
if (true) return;
System.out.println("I hate Java");
// OK.
Dzięki.
EDIT:
dowiem się punkt po kilku minutach:
W pierwszym przypadku kompilator zgłasza błąd z powodu nieskończonej pętli. W obu przypadkach kompilator nie myśli o kodzie wewnątrz instrukcji statement.
EDIT II:
Co zawiodła mnie na javac teraz jest:
if (true) return; // Correct
}
while (true) return; // Correct
}
Wygląda javac wie, co jest w środku obu pętli i jeśli konsekwentnie, ale kiedy piszesz innego polecenia (jak w pierwszym przykładzie) otrzymujesz zachowanie nierównoważne (które wygląda tak, jak javac zapomniał, co jest wewnątrz pętli/jeśli).
public static final EDIT III: W wyniku tej odpowiedzi mogę uwaga (mam nadzieję, że poprawne): wyrażenia jak if (arg) { ...; return;}
i while (arg) { ...; return;}
równoważne zarówno semantycznie i składniowo (w kodu bajtowego) Java IFF argv
jest nie- wyrażenie stałe (lub skutecznie typu końcowego). Jeśli argv
jest stałym wyrażeniem bytecode (i zachowaniem) może się różnić.
Zastrzeżone To pytanie nie jest nieosiągalny sprawozdania, ale innego obchodzenia się z logicznie równoważne wyrażenia takie jak while true return
i if true return
.
Jest to przypadek "Jeśli piszę szalony kodu, kompilator może również działać crazy". – Kayaman
@Andremoniy Nope. Proszę czytać uważnie. – marek094
@ marek094, jaki jest twój zamiar takiego porównania? Java nie jest językiem niższego poziomu i dlatego kompilator nie jest kompilatorem języka maszynowego. Jaka jest dokładna odpowiedź, której szukasz, lub dokładne pytanie, które zamierzasz zadać? Ponadto, biorąc pod uwagę liczbę wirtualnych maszyn i kompilatorów dostępnych obecnie, jest to, moim zdaniem, bardzo ogólne i mniej informujące pytanie. –