Подтвердить что ты не робот

Если (ложное состояние ==). Зачем?

Я получил код от кого-то, работавшего ранее на нем, и он содержит много строк, например

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...

4b9b3361

Ответ 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))