Зачем ставить константу перед переменной в сравнении?

Некоторое время назад я заметил следующий синтаксис в нашем коде:

if( NULL == var){
   //...
}

или

if( 0 == var){
  //...
}

и т.д.

Может кто-нибудь объяснить, почему человек, который написал это, выбирает эту нотацию вместо обычного способа var == 0)?

Это вопрос стиля, или это как-то влияет на производительность?

Ответ 1

Это механизм, позволяющий избежать таких ошибок:

if ( var = NULL ) {
  // ...
}

Если вы напишете его с именем переменной в правой части, компилятор сможет поймать некоторые ошибки:

if ( NULL = var ) {  // not legal, won't compile
  // ...
}

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

Edit:

Как упоминает Эван в комментариях, любой достойный компилятор предупредит вас об этом, если вы включите предупреждения, например, gcc -Wall предоставит вам следующее:

warning: suggest parentheses around assignment used as truth value

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

Наконец, как указывает Майк Б, это вопрос стиля и не влияет на производительность программы.

Ответ 2

Если вы ошибочно положили

if ( var = NULL )

вместо

if ( var == NULL )

тогда будет только предупреждение компилятора. Если вы измените порядок:

if ( NULL == var )

тогда будет ошибка компилятора, если вы поместите

if ( NULL = var )

Лично мне не нравится читать написанный таким образом код, и я сделал эту ошибку только один раз в первый год кодирования. =)

Ответ 3

Чтобы избежать

if (var = NULL)

ошибка

Ответ 4

Следствие: старайтесь использовать const столько, сколько сможете.

const int val = 42;

if (val = 43) {
    ...
}

не будет компилироваться.

Ответ 5

Цитата Joel On Software, Руководство для интервьюерства:

Иногда вы увидите, что программист на C пишет что-то вроде if (0 == strlen (x)), помещая константу в левую сторону символа ==. Это действительно хороший знак. Это означает, что они были ужалены один раз слишком много раз, запутывая = и == и заставили себя изучить новую привычку избегать этой ловушки.

(Я не являюсь поклонником этой "лучшей практики".)

Ответ 6

Кстати, я уже много лет преподавал C новым программистам, что, если вы тренируете себя, чтобы читать "=" как "получает" и "==" как равные, это само по себе спасет вас от много этих ошибок. Затем вы читаете

if( x = 0){

как "если x получает 0 тогда", и это начинает звучать странно.

Ответ 7

Лично я предпочитаю

if (!x) {