Ответ 1
Да, это правильно. Чтобы определить опечатку =
вместо ==
.
Возможные дубликаты:
Как проверить равные? (0 == i) или (i == 0)
Почему в С# часто видят "null!= variable" вместо "variable!= null" ?
Я смотрел на нечетный учебник здесь и там, а также на некоторый код DirectX и заметил, что многие опытные программисты на C++ пишут выражения следующим образом:
(<constant> == <variable>)
а не то, что предпочитает моя обычная мудрость:
(<variable> == <constant>)
например. if (NULL == ptr)
, а не if (ptr == NULL)
. Я предпочитаю вторую альтернативу, если нет других причин для выбора первого, моя причина в том, что переменная, кажется, является "получающим" концом выражения.
Но я подозреваю, что первый используется, чтобы избежать непреднамеренного назначения значения константы переменной с помощью =
, а не ==
. Правильно ли это?
Да, это правильно. Чтобы определить опечатку =
вместо ==
.
Это было так, да. Конечно, в настоящее время почти все компиляторы предупреждают о назначениях в условиях if()
, поэтому преимущество есть только для людей, которые обычно подавляют предупреждения.
потому что вы не можете назначить значение константе, поэтому, если по ошибке вы помещаете =
вместо ==
, компилятор выдает ошибку, предупреждая вас
Это было названо как "Yoda Conditional"!
См. здесь https://stackoverflow.com/questions/2349378/new-programming-jargon-you-coined
Мне очень нравится этот термин, потому что:
if(Light::On == light)
Считывается как:
"Если включено свет"
Как уже говорилось, это используется для предотвращения неправильного присвоения. Можно утверждать, что эта практика является архаичной на основе современных IDE, но я по-прежнему считаю, что это хорошая практика.
Это обычное оправдание, так же как и аргумент, что вы не хотите толкать константу в крайнем правом углу экрана с выраженным выражением. Последний аргумент никогда не казался мне особенно убедительным, и первое не действительно действительно в наши дни, поскольку любой уважающий себя компилятор выдаст предупреждения (вы компилируете с предупреждениями как ошибки, не так ли?:-).
EDIT: я просто просмотрел новый предварительный просмотр Xcode 4 и просто посмотрю на пример, который они выбрали, чтобы продемонстрировать свою новую функцию "Fix-it"!
alt text http://devimages.apple.com/technologies/tools/images/new_autocorrect20100721.jpg
Чтобы понять разницу между назначением и сравнением.
Если вы имеете в виду:
if (ptr == foo)
но введите
if (ptr = foo)
если все равно будет действительным кодом, так как ptr = foo
будет оценивать логическую проверку на ptr
после того, как она будет установлена в значение foo
. Очевидно, вы не хотите этого.
Тем не менее, я нахожу, что это сильно ухудшает читаемость, и учитывая, что большинство IDE и препроцессоров все равно поймают это, никогда не используйте этот стиль.
Это позволяет избежать написания var = NULL
. Запись NULL = var
приведет к ошибке. Итак, вы правы: -)
Ознакомьтесь с самым высоким ответом на этот вопрос.
https://stackoverflow.com/questions/2349378/new-programming-jargon-you-coined
Они назвали этот стиль кодирования "Условиями Йоды".
Назначение уловки является основной причиной использования условий Yoda, но есть и другие. В С++ оператор вызывается в операнде LHS. Поскольку константы обычно const
(duh) или примитивы, это ограничивает возможность нечувствительных операций. Один пример: =
в примитивном литерале, например, общая причина (1 = a
), но это будет включать operator=() const
или любой другой оператор, используемый для не-POD-типов.
С таким языком, как VB 6.0, который не имеет отдельных операторов присваивания и сравнения,
a = 2
'Будет компилироваться, независимо от того, имеете ли вы, что присвоено 2 или сравниваете ли вы с 2 Если вы хотите сравнить, существует вероятность того, что возникнет ошибка времени выполнения.
'Для назначения, если вы всегда пишете
a = 2
'И для назначения, если вы всегда пишете
2 = a
'Вы исключаете сценарий компиляции и сценарий времени выполнения.
Но это только совет: визуальный намек недоступен, если у вас есть выражение типа
a = b 'Сравнение или присвоение?
С# имеет: - различное присвоение (=) и сравнение (==) символов - сравнения должны быть заключены в скобки.
Затем это становится проблемой.
Потому что они знают, что они делают: P
Вы правы - это вызвать ошибку компилятора, если вы ошиблись "==" как "=", так как присваивание всегда будет возвращать true. Хотя это, как правило, легко заметить и отлаживать, время от времени будет очень сложно обнаружить ошибку, подумайте об этом:
#define OK 2 // Or something...
[...]
while(status = OK){
// This loop will never end
// Even if you change the value of status within it
[...]
}
Это может быть неприятная ошибка, особенно если блок, относящийся к оскорбительному выражению, длинный (представьте, что вы ищете все возможные причины, по которым статус всегда остается в порядке).
Если, с другой стороны, вы использовали:
while(OK = status){
Это вызовет ошибку компилятора, поскольку вы не можете присвоить значение константе.
Эта практика иногда упоминается как условия Йоды, поскольку она сопоставляет объект и объект. Как "если статус в порядке" против "если ОК - это состояние" и "небо голубое", а "синее небо" - последнее, что может сказать Йода.
Как разработчик Java, я предпочитаю писать такие выражения:
//primitive check
if(constant == variable)
//Object check
if(constant.equals(variable))
Это особенно важно для объекта, потому что выражение не является ошибкой, если переменная имеет значение null. Если бы выражение находилось в другом порядке, ошибка в null была бы ошибкой. Я поддерживаю согласованность и выполняю тот же порядок для примитивов.