Зачем ставить константу перед переменной в сравнении? - PullRequest
14 голосов
/ 16 декабря 2008

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

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

или

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

и подобные вещи.

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

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

Ответы [ 7 ]

28 голосов
/ 16 декабря 2008

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

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

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

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

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

Edit:

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

warning: suggest parentheses around assignment used as truth value

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

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

8 голосов
/ 16 декабря 2008

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

if ( var = NULL )

вместо

if ( var == NULL )

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

if ( NULL == var )

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

if ( NULL = var )

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

5 голосов
/ 16 декабря 2008

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

if (var = NULL)

ошибка

3 голосов
/ 16 декабря 2008

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

const int val = 42;

if (val = 43) {
    ...
}

не скомпилируется.

3 голосов
/ 16 декабря 2008

Цитируя Джоэля о программном обеспечении, Партизанское руководство по проведению собеседований :

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

(я на самом деле не фанат этой "лучшей практики".)

1 голос
/ 16 декабря 2008

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

if (!x) {

1 голос
/ 16 декабря 2008

Кстати, в течение многих лет я учил новых программистов на С, что если вы научитесь читать «=» как «получает» и «==» как равные, это само по себе спасет вас от много этих ошибок Тогда вы читаете

if( x = 0){

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

...