Возможные дубликаты:
То, как проверить на, равняется? (0 == i) или (я == 0)
Почему делает тот, часто см. “пустой указатель! = переменная” вместо “переменной! = пустой указатель” в C#?Я взглянул на нечетное учебное руководство тут и там, а также некоторый код DirectX и заметил, что многие опытные программисты на C++ пишут выражения следующим образом:
(
== ) вместо того, что мое расхожее мнение, кажется, предпочитает:
(
== ) Например.
if (NULL == ptr)
вместоif (ptr == NULL)
. Я предпочитаю вторую альтернативу, при отсутствии других причин выбора первого, при этом моя причина состоит в том, что переменная, кажется, конец "получения" выражения.Но я подозреваю, что первый используется, чтобы не непреднамеренно присваивать значение константы к переменной при помощи
=
вместо==
. Это было бы корректно?
Да, верно. Это необходимо для обнаружения опечатки =
вместо ==
.
Раньше так и было, да. Конечно, сейчас почти все компиляторы предупреждают о присваиваниях в условиях if()
, так что преимущество есть только для тех, кто регулярно подавляет предупреждения.
потому что вы не можете присвоить значение константе, поэтому, если вы по ошибке поместите =
вместо ==
, компилятор выдаст ошибку, предупреждаю вас
Это обычное оправдание, так же как и аргумент, что вы не хотите выводить константу в дальний правый угол экрана с помощью длинного выражения. Последний аргумент никогда не казался мне особенно убедительным, а первый в наши дни не имеет смысла, поскольку любой уважающий себя компилятор выдает предупреждения (вы ведь компилируете с предупреждениями как с ошибками, не так ли? :-).
EDIT: Я только что наткнулся на новый предварительный просмотр Xcode 4, и только посмотрите на пример, который они выбрали для примера своей новой функции "Fix-it"!
(source: apple.com)
Чтобы уловить разницу между назначением и сравнением.
Если вы имеете в виду:
if (ptr == foo)
, но введите
if (ptr = foo)
, если код все еще будет действительным, поскольку ptr = foo
будет выполнять логическую проверку на ptr
после того, как это было установить значение foo
. Очевидно, вы этого не хотите.
Однако я считаю, что это значительно ухудшает удобочитаемость, и, учитывая, что большинство IDE и препроцессоров все равно это поймают, никогда не используйте этот стиль.
Это позволяет избежать того, что вы пишете var = NULL
. Написание NULL = var
приведет к ошибке. Так что вы правы :-)
Ловля присваивания - основная причина использования условий Yoda, но есть и другие: В C++ оператор вызывается на операнде LHS. Поскольку константы обычно являются const
(duh), или примитивами, это ограничивает возможность несенсационных операций. Одним из примеров является =
на примитивном литерале, например, по распространенной причине (1 = a
), но это будет включать operator=() const
, или любой другой оператор, используемый для не-POD типов.
С таким языком, как VB 6.0, который не имеет отдельных операторов присваивания и сравнения,
a = 2
'Будет компилироваться, независимо от того, имеете ли вы в виду, что a присвоено 2, или вы сравниваете a с 2 Если вы имели в виду сравнение, есть вероятность, что произойдет ошибка времени выполнения.
'Для присвоения, если вы всегда пишете
a = 2
' И для присвоения, если вы всегда пишете
2 = a
', вы исключаете сценарий успешной компиляции и ошибки выполнения.
Но это только подсказка: визуальная подсказка недоступна, если у вас есть выражение вроде
a = b 'Сравнение или присваивание?
В C # есть: - разные символы присваивания (=) и сравнения (==) - сравнения следует заключать в квадратные скобки.
Тогда это перестает быть проблемой.
Посмотрите ответ на этот вопрос, получивший наивысший рейтинг...
https://stackoverflow.com/questions/2349378/new-programming-jargon-you-coined
Они окрестили этот стиль кодирования "Условия Йоды".
Вы правы - это вызывает ошибку компилятора, если вы неправильно набираете "==" как "=", поскольку присвоение всегда будет возвращать истину. Хотя обычно это легко заметить и отладить, время от времени это превращается в очень трудную для обнаружения ошибку, подумайте об этом:
#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))
Это особенно важно для объекта, потому что выражение не содержит ошибок, если переменная равна нулю. Если бы выражение было в другом порядке, пустая переменная выдала бы ошибку. Я поддерживаю последовательность и делаю тот же порядок для примитивов.
Это было названо «условием Йоды»!
См. Здесь https://stackoverflow.com/questions/2349378/new-programming-jargon-you-coined
Мне очень нравится этот термин, потому что:
if(Light::On == light)
Читается как:
«Если горит свет »
Как уже говорилось, это используется для предотвращения неправильного назначения. Можно утверждать, что эта практика является архаичной на основе современных IDE, но я все же считаю ее хорошей практикой.