В чем разница между 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 =/==, и написать его наоборот, не помогло бы, поскольку это было сравнение между варсами.