2012-02-13 8 views
5

To jest bezpośrednio inspirowane przez this question.
Istnieje wiele odniesień/stwierdzeń, że operatory bitowe, gdy zostaną zastosowane do wartości logicznych, nie ulegną zwarciu. Innymi słowy, boolean a = f() & g(), gdzie f() i g() zwracają wartość logiczną, , zarówno będą zawsze oceniane.
Jednak JLS mówi tylko:Co (w specyfikacji) gwarantuje, że "operatorzy logiczni nie powodujący zwarcia nie będą faktycznie mieli zwarcia?

15.22.2 logiczne Operatory logiczne &^i |
Kiedy oba operandy wynoszą &,^lub | operator jest typu boolean lub Boolean, a następnie typu , wyrażenie operatora bitowego ma wartość boolean. We wszystkich przypadkach operandy są poddawane konwersji Unboxing (§ 5.1.1) w razie potrzeby.

Dla wartości & wartość wyniku ma wartość true, jeśli oba argumenty są prawdziwe; w przeciwnym razie wynikiem jest fałsz.

Dla^wartość wyniku ma wartość true, jeśli wartości argumentu są różne; w przeciwnym razie wynikiem jest fałsz.

Dla |, wartość wyniku jest fałszywa, jeśli obie wartości argumentu są fałszywe; w przeciwnym razie wynik jest prawdziwy.

Jak to gwarantuje, że oba operandy są rzeczywiście oceniane? Oprócz xor nadal można złamać i zwrócić wynik, jeśli jeden z argumentów (i może być sekundowy/prawy jako pierwszy do oceny) narusza warunek.
Np. a & b musiałby tylko ocenić, czy b ma wartość false, aby ocenić wyrażenie jako fałszywe.
Uwaga: nie pytam, czy jest to realizowane w ten sposób (nie ma zwarcia) - na pewno jest.

pytam:

Byłoby wdrożenie go zwarcia naruszają normy język ?

+0

Tak. Standardowy tekst określa wartości dla obu wartości operandu, tj. Oba wyrażenia muszą zostać przeanalizowane. – rsp

Odpowiedz

4

Zobacz JLS 15.7.2 Evaluate Operands before Operation

Język programowania Java gwarantuje również, że każdy operand operatora (z wyjątkiem operatorów warunkowych & :) i pojawia &, ||,?, Aby być w pełni ocenione przed każdą część operacji sam jest wykonywany.

Więc jeśli masz operatorowi &, oba operandy muszą zostać ocenione zanim ostateczny wynik jest obliczany.

Dodatkowo, sekcja przed tą jawnie żąda, aby lewy operand dowolnego operatora binarnego musiał być najpierw oceniony.

+0

Dobry połów! Dzięki! – wmz

+0

Policz mi, że jestem pod wrażeniem _finding_ tej sekcji. –

1

JLS wyraźnie stwierdza, że ​​skrót jest wykonywany dla warunkowego-lub warunkowego-i. Wyjaśnia zachowanie warunkowego-lub/i pod względem operacji bitowych lub/i operatorów. Podkreśla więc, że skrót jest odmianą zachowania operatorów bitowych.

Powiedziałbym, że użycie skrótu naruszyłoby standard. Z pewnością naruszyłoby to oczekiwania programistów.

15.24 Warunkowe-lub Operator ||

& & operator jest jak & (§15.22.2), ale ocenia jego prawy operand tylko wtedy, gdy wartość jego lewej argument jest prawdziwy.

Powiązane problemy