Это действительно так работает?
Да
А этот способ "обмана" - плохая практика, или мне просто повезло, что я никогда не видел ничего подобного?
Использование логических или условных операторов для управления потоком программ вместо управляющей структуры не является хорошей практикой, нет. Это не то, для чего эти операторы. IOW, написание
some_condition && some_action();
в качестве замены
if ( some_condition )
some_action();
не является хорошей практикой.
Однако, если вы хотите вычислить логическое выражение и присвоить результат где-либо, даже если одно из условий является вызовом функции, тогда все в порядке:
result = some_value && some_function();
IOW, мы вычисляем значение с использованием оператора &&
, не контролируя поток программы (даже если &&
влияет на то, будет ли вызван some_function()
).
То же самое относится к оператору ?:
. Запись
some_condition ? some_action() : some_other_action();
в качестве замены
if ( some_condition )
some_action();
else
some_other_action();
это плохая практика. Тем не менее,
result = some_condition ? some_function() : some_other_function();
нормально, потому что мы не используем его для управления потоком программ, мы используем его для вычисления значения.