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 ?
Tak. Standardowy tekst określa wartości dla obu wartości operandu, tj. Oba wyrażenia muszą zostać przeanalizowane. – rsp