Вы используете короткое замыкание или. Если первый аргумент верен, то все выражение истинно.
Может помочь, если я добавлю неявные скобки, которые использует компилятор
Редактировать : Как отметил Крис Джестер-Янг, это на самом деле потому, что логические операторы должны иметь ассоциативность слева направо:
if (func1() || (func2() && func3()))
После того, как func1 возвращается, он становится таким:
if (true || (func2() && func3()))
После оценки короткого замыкания или становится:
if (true)