Почему некоторые опытные программисты пишут сравнения со значением перед переменной? [дубликат]

Возможные дубликаты:
То, как проверить на, равняется? (0 == i) или (я == 0)
Почему делает тот, часто см. “пустой указатель! = переменная” вместо “переменной! = пустой указатель” в C#?

Я взглянул на нечетное учебное руководство тут и там, а также некоторый код DirectX и заметил, что многие опытные программисты на C++ пишут выражения следующим образом:

( == )

вместо того, что мое расхожее мнение, кажется, предпочитает:

( == )

Например. if (NULL == ptr) вместо if (ptr == NULL). Я предпочитаю вторую альтернативу, при отсутствии других причин выбора первого, при этом моя причина состоит в том, что переменная, кажется, конец "получения" выражения.

Но я подозреваю, что первый используется, чтобы не непреднамеренно присваивать значение константы к переменной при помощи = вместо ==. Это было бы корректно?

21
задан Josh Caswell 16 December 2017 в 16:55
поделиться

13 ответов

Да, верно. Это необходимо для обнаружения опечатки = вместо == .

25
ответ дан 29 November 2019 в 06:14
поделиться

Раньше так и было, да. Конечно, сейчас почти все компиляторы предупреждают о присваиваниях в условиях if(), так что преимущество есть только для тех, кто регулярно подавляет предупреждения.

28
ответ дан 29 November 2019 в 06:14
поделиться

потому что вы не можете присвоить значение константе, поэтому, если вы по ошибке поместите = вместо == , компилятор выдаст ошибку, предупреждаю вас

6
ответ дан 29 November 2019 в 06:14
поделиться

Это обычное оправдание, так же как и аргумент, что вы не хотите выводить константу в дальний правый угол экрана с помощью длинного выражения. Последний аргумент никогда не казался мне особенно убедительным, а первый в наши дни не имеет смысла, поскольку любой уважающий себя компилятор выдает предупреждения (вы ведь компилируете с предупреждениями как с ошибками, не так ли? :-).

EDIT: Я только что наткнулся на новый предварительный просмотр Xcode 4, и только посмотрите на пример, который они выбрали для примера своей новой функции "Fix-it"!

alt text
(source: apple.com)

6
ответ дан 29 November 2019 в 06:14
поделиться

Чтобы уловить разницу между назначением и сравнением.

Если вы имеете в виду:

if (ptr == foo)

, но введите

if (ptr = foo)

, если код все еще будет действительным, поскольку ptr = foo будет выполнять логическую проверку на ptr после того, как это было установить значение foo . Очевидно, вы этого не хотите.

Однако я считаю, что это значительно ухудшает удобочитаемость, и, учитывая, что большинство IDE и препроцессоров все равно это поймают, никогда не используйте этот стиль.

5
ответ дан 29 November 2019 в 06:14
поделиться

Это позволяет избежать того, что вы пишете var = NULL. Написание NULL = var приведет к ошибке. Так что вы правы :-)

2
ответ дан 29 November 2019 в 06:14
поделиться

Ловля присваивания - основная причина использования условий Yoda, но есть и другие: В C++ оператор вызывается на операнде LHS. Поскольку константы обычно являются const (duh), или примитивами, это ограничивает возможность несенсационных операций. Одним из примеров является = на примитивном литерале, например, по распространенной причине (1 = a), но это будет включать operator=() const, или любой другой оператор, используемый для не-POD типов.

1
ответ дан 29 November 2019 в 06:14
поделиться

С таким языком, как VB 6.0, который не имеет отдельных операторов присваивания и сравнения,

a = 2

'Будет компилироваться, независимо от того, имеете ли вы в виду, что a присвоено 2, или вы сравниваете a с 2 Если вы имели в виду сравнение, есть вероятность, что произойдет ошибка времени выполнения.

'Для присвоения, если вы всегда пишете

a = 2

' И для присвоения, если вы всегда пишете

2 = a

', вы исключаете сценарий успешной компиляции и ошибки выполнения.

Но это только подсказка: визуальная подсказка недоступна, если у вас есть выражение вроде

a = b 'Сравнение или присваивание?

В C # есть: - разные символы присваивания (=) и сравнения (==) - сравнения следует заключать в квадратные скобки.

Тогда это перестает быть проблемой.

1
ответ дан 29 November 2019 в 06:14
поделиться

Потому что они знают, что делают :P

0
ответ дан 29 November 2019 в 06:14
поделиться

Посмотрите ответ на этот вопрос, получивший наивысший рейтинг...

https://stackoverflow.com/questions/2349378/new-programming-jargon-you-coined

Они окрестили этот стиль кодирования "Условия Йоды".

2
ответ дан 29 November 2019 в 06:14
поделиться

Вы правы - это вызывает ошибку компилятора, если вы неправильно набираете "==" как "=", поскольку присвоение всегда будет возвращать истину. Хотя обычно это легко заметить и отладить, время от времени это превращается в очень трудную для обнаружения ошибку, подумайте об этом:

#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){

Это привело бы к ошибке компилятора, поскольку вы не можете присвоить значение константе.

Эту практику иногда называют условиями Йоды, поскольку она сопоставляет объект и субъект. Например, «если статус в порядке» против «если все в порядке» и «небо голубое» против «синее небо» - последнее, что может сказать Йода.

1
ответ дан 29 November 2019 в 06:14
поделиться

Как разработчик java я обычно пишу такие выражения:

   //primitive check
   if(constant == variable)

   //Object check
   if(constant.equals(variable))

Это особенно важно для объекта, потому что выражение не содержит ошибок, если переменная равна нулю. Если бы выражение было в другом порядке, пустая переменная выдала бы ошибку. Я поддерживаю последовательность и делаю тот же порядок для примитивов.

-2
ответ дан 29 November 2019 в 06:14
поделиться

Это было названо «условием Йоды»!

См. Здесь https://stackoverflow.com/questions/2349378/new-programming-jargon-you-coined

Мне очень нравится этот термин, потому что:

if(Light::On == light)

Читается как:

«Если горит свет »

Как уже говорилось, это используется для предотвращения неправильного назначения. Можно утверждать, что эта практика является архаичной на основе современных IDE, но я все же считаю ее хорошей практикой.

9
ответ дан 29 November 2019 в 06:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: