Зачем ставить константу перед переменной в сравнении?
Некоторое время назад я заметил следующий синтаксис в нашем коде:
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) {