2016-05-21 86 views

Odpowiedz

3

Jest jakaś miara "dlaczego" w tym poprzednim przepełnienie stosu pytanie:

0xp0 prints 0.0 (Hexadecimal Floating Point Literal)

i tutaj:

P in constant declaration

Ta "najlepsza odpowiedź" z @NPE daje uzasadnienie:

Na pierwszy rzut oka może się wydawać, że prefiks 0x jest wystarczający, aby zidentyfikować literał zmiennoprzecinkowy, więc dlaczego projektanci Javy wybrano do zmiany litery od e do p? Ma to związek z tym, że e jest poprawną cyfrą heksadecymalną, więc utrzymanie jej powodowałoby niejednoznaczność analizy. Rozważmy:

0x1e + 2

Czy to hex podwójne lub suma dwóch liczb całkowitych, 0x1e i 2? Kiedy zmieniamy e p, dwuznaczność jest rozwiązany:

0x1p + 2

7

Cóż, jeśli naprawdę masz na myśli , dlaczego, będziemy musieli mieć nadzieję, że jeden z osób odpowiedzialnych za składnię zadzwoni. Wygląda na to, że dodanie opcjonalnego wykładnika nie zaszkodzi możliwości analizowania dosłownie, ale nie rozważałem tego szczegółowo. Wszystko, co mogę zaoferować to, że Java Language Specification §3.10.2 wymaga:

Dla szesnastkowym literałów zmiennoprzecinkowych, wymagany jest co najmniej jedna cyfra (w obu całej ilości lub części frakcji), a wykładnik jest obowiązkowe, a sufiks typu float jest opcjonalny. Wykładnik jest oznaczony literą ASCII p lub P, a następnie opcjonalnie liczbą całkowitą ze znakiem.