почему java возвращает логические операторы при компиляции


Фактический код java:

((rrd == null || !rrd) 
    && null != dam
    && null != dam.getac()
    && null != dam.getac().getc() 
    && null != sname 
    && sname.equalsIgnoreCase(dam.getac().getc()))

Но когда я смотрю в файл класса, это:

((rrd != null) && (rrd.booleanValue())) 
    || ((((null == dam) 
    || (null == dam.getac()) 
    || (null == dam.getac().getc()) 
    || (null == sname) 
    || (!(sname.equalsIgnoreCase(dam.getac().getc()))))))

Все || и && поменялись местами.

Может ли кто-нибудь объяснить почему?
2   7   2016-03-08 15:40:30

2 ответа:

Выражения не эквивалентны, а инвертированы. Похоже, компилятор избегает внешнего (или подразумеваемого) не здесь.

Обратите внимание, что короткое замыкание возможно для обеих операций, || и &&-в первом случае, когда встречается истинное под-выражение, и во втором случае, когда встречается ложное под-выражение. Так что способность к короткому замыканию сама по себе не объясняет этого.

См.: Законы Де Моргана

!А || !Б == !(A && B)