Здравствуйте, Alekzander, Вы писали:
A>Это хуже йодинга: смысл перестановка меняет незначительно лишь, а инверсия страшная тут.
Смысл меняется, и очень-очень сильно.
true обычно равно 0xFFFFFFFF.
При этом
if(a) компилируется/интерпретируется как
if(a!=0), подразумевая любое ненулевое значение.
В итоге, если в a попадает 42, то
if(a == true) пройдёт мимо, а
if(a != false) зайдёт внутрь. Как и
if(a).
Так что,
возможно пишет
if(a == true) вовсе не идиот.
Может быть, a имеет тип "недоперечисления", которое организовано так, что -1 = started; 0 = stopped; 1 = starting; 2 = stopping; 16 = error. Для совместимости с совсем древним кодом, который написан для времён с двумя статусами сервиса, которые он проверял через if(!service->status).
А теперь нам нужен код, который убеждается, что сервис именно что запущен.
A>Если тип не bool, они в таких случаях пишут каст плюс == true.
Даже если тип bool, не всегда он сформирован честным образом из констант true, false, и булевых операций. Даже в дотнете я налетал (правда, из-за бага в моём же unsafe коде) на то, что булевая логика на SIMD дала не true, а non-false результат. В итоге, код с if(a) прекрасно работал, а вот тесты, которые сравнивали вычисленный массив булеанов с референс-значениями, фейлились.
A>Боюсь, не совсем понимаю. service.IsStarted это почти наверняка функция (аксессор). И?
Всё зависит от системы типов в языке.
Например,
if(service.IsStarted) внезапно убеждается, что адрес этой функции ненулевой. И если ваш язык — не typescript, то не всякий компилятор будет вам намекать на отсутствие скобок.
А вот
if(service.IsStarted == true) уже имеет некоторые шансы нарваться на
no operator== defined for the arguments of type 'bool (*check)()' and 'bool'.
С другой стороны, это недостаточно каргокультно.
По классике, нужно писать вот так:
if(true == service.IsStarted())