В чем разница между if (CONST == variable) или if (variable == CONST)?
Есть ли разница в порядке порядка сравнения?
#define CONST_VALUE 5
int variable;
...
if ( variable == CONST_VALUE ) // Method 1
...
OR
if ( CONST_VALUE == variable ) // Method 2
...
Это просто вопрос предпочтения или есть веская причина для конкретного порядка сравнения?
Ответы
Ответ 1
Причина, по которой некоторые люди используют метод 2, состоит в том, что вы получите ошибку компилятора, если вы ошибаетесь a = вместо ==.
Однако у вас будут люди (например, я), которые будут по-прежнему использовать метод 1, потому что они находят его более читабельным и, если есть ошибка, он будет обнаружен во время тестирования (или, в некоторых случаях, статического анализа код).
Ответ 2
Единственное отличие состоит в том, что (переменная CONST_VALUE ==) делает невозможным компиляцию общей опечатки (CONST_VALUE = variable).
Для сравнения, if (variable = CONST_VALUE) приведет к тому, что компилятор подумает, что вы должны назначить CONST_VALUE переменной "."
The =/== путаница - довольно распространенный источник ошибок в C, поэтому люди пытаются обойти проблему с соглашениями о кодировании.
Конечно, это не спасет вас, если вы сравниваете две переменные.
И вопрос, кажется, является дубликатом Как проверить на равные? (0 == i) или (i == 0)
И вот еще информация: http://cwe.mitre.org/data/definitions/481.html
Ответ 3
Как упоминалось выше, переменная CONST_VALUE == избегает символа = typo.
Я все еще делаю "переменная == CONST_VALUE", потому что я считаю ее более читаемой и когда вижу что-то вроде:
if(false == somevariable)
мое кровяное давление растет.
Ответ 4
Первый вариант
if (variable == CONST_VALUE)
лучше, потому что это более читаемо. Это следует за соглашением (также используемым в математике), что первое значение имеет наибольшее значение.
Второй вариант
if (CONST_VALUE == variable)
используется некоторыми людьми для предотвращения смешивания проверки равенства с присваиванием
if (CONST_VALUE = variable)
Есть лучшие способы добиться этого, например, включить и принять во внимание предупреждения компилятора.
Ответ 5
Другие уже указали причину. =/== путаница. Я предпочитаю первую версию, потому что она более внимательно следит за развитием мысли. Некоторые компиляторы устраняют путаницу = и ==, вызывая предупреждение, когда он встречает что-то вроде
if(a=b)
в этом случае, если вы действительно хотели выполнить назначение, которое вы вынуждены написать
if((a=b))
который я буду писать тогда как
if( (a=b) != 0)
чтобы избежать путаницы.
Это сказало, что у нас в нашем случае с кодом 1, где у нас была путаница a =/==, и написать его наоборот, не помогло бы, поскольку это было сравнение между варсами.