Если (ложное состояние ==). Зачем?
Я получил код от кого-то, работавшего ранее на нем, и он содержит много строк, например
while(false==find && false == err && k<kmax)
if(true==refract(ep1,ep2,n1,RI_blood, RI_collagen))
и моя любимая строка
if(false == (ret_s<0))
Другой код выполняется очень хорошо, задокументирован просто отлично, но эти строки с этими нечетными условиями отбрасывают меня, и мне интересно, почему они сделаны таким образом.
Особенно, что false==(ret_s<0)
совершенно запутан, и вам нужно прочитать эту строку, как три раза, чтобы понять, что они там хотят.
Является ли это распространенным стилем программирования, не понимаю ли я его аргументацию или это просто плохой стиль?
Изменить: я не чувствую, что это похоже на if (object == NULL) vs if (NULL == object), поскольку это не случайное назначение, а об обфускации if clauses...
Ответы
Ответ 1
Это общий стиль программирования?
Нет.
Разве я не понимаю причины этого?
Некоторым людям нравится явно сравнивать boolean с true
или false
, хотя результат будет точно таким же логическим значением. Логика, по-видимому, состоит в том, что, делая код более трудным для чтения и более удивительным, люди будут думать об этом сложнее и делать меньше предположений о его поведении. Или, возможно, этот код должен быть трудно поддерживать, поскольку его было сложно написать.
Другие любят писать сравнения с константами назад, что предотвращает ошибки типа if (x = 5)
, когда вы имели в виду if (x == 5)
. Любой современный компилятор предупредит вас об этой ошибке, поэтому его единственная реальная цель - сделать код более трудным для чтения.
Объединяя эти два поведения, вы получаете причудливый код, который вы опубликовали.
Или это просто плохой стиль?
Это стиль. Я не сужу о стиле, но если вам нравится поддерживать программистов на ногах, это, безусловно, делает это. Лично мне нравится, чтобы мой код был читабельным, но это только я.
моя любимая строка
Я однажды столкнулся с return a && !b
, реализованным примерно в десяти строках кода. Первая строка была switch(a)
.
Ответ 2
Условия Йоды
![enter image description here]()
Использование if (константа == variable) вместо if (variable == constant), например if (4 == foo). Потому что это говорит о том, "если синий - небо" или "если высокий мужчина".
Ответ 3
Его безопасная защита от назначения в С++.
В С++ вполне законно это делать
if (foo = true) ....
В этом случае одиночный =
является присваиванием и заменяет значение foo
.
Это не является законным и будет генерировать ошибку компилятора
if (true = foo) ....
Ответ 4
Константы и литералы часто ставятся слева, потому что это предотвращает случайные задания. Рассмотрим типизацию:
if(foo == bar)
как:
if(foo = bar)
Может показаться, что второй работает... но тихо clobber foo
. Если foo
является константой, эта ошибка становится невозможной.
Ответ 5
Это метод самозащиты, который мешает вам случайно ввести оператор присваивания (=
) вместо оператора равенства (==
), который может ввести странные ошибки. Помещение постоянного значения с левой стороны приведет к ошибке компилятора, в то время как перенос переменной на LHS будет просто компилироваться.
Ответ 6
Возможно, исходный программист думал, что явное сравнение с истинным или ложным было более ясным, чем if(condition)
или if(!condition)
, и закодированные вещи таким образом. Я еще не видел этот стиль.
Это довольно субъективно, но я считаю, что while(!find && !err && k<kmax)
легче читать.
Ответ 7
Код мог быть написан для магазина, где есть стандарт сайта, в котором каждый условный оператор должен включать оператор сравнения, чтобы избежать случайного исключения части сравнения. (Возможно, это растяжка, но вы сказали, что остальная часть кода была очень хороша.) Это в сочетании со стандартом или привычкой ставить константу слева, чтобы избежать случайного использования = вместо ==, дало бы в значительной степени код, который вы показали. Однако это не объясняет использование "ложного", а не более естественного "истинного". Возможно, он (ошибочно на нескольких уровнях) пытается получить микроэффективность по сравнению с нулем вместо 1 на уровне машины.
Ответ 8
для моего только плохой стиль,
if(false == (ret_s<0))
равна в С#
if(!(ret_s<0))