В чем разница между if(varName) и if(varName!=NULL)?

#c #performance #variables #if-statement #null

#c #Производительность #переменные #if-оператор #null

Вопрос:

В чем разница между этим:

 if( varName != NULL ){
  // Do something
}
  

И:

 if( varName ){
 // Do something
}  
  

Я имею в виду, есть ли разница в скорости процесса? Или это только лучшая производительность?

PD: Я работаю с C.

Комментарии:

1. Разницы нет

2. Лучший способ ответить на этот вопрос — скомпилировать с -S параметром, а затем посмотреть на результирующую сборку. При отключенной оптимизации может быть разница, но при включенной оптимизации код сборки должен быть идентичным.

3. Это дело вкуса, мне нравится if (varName != NULL) . Некоторым нравится if (varName) , и вы сделали что-то, что я считаю действительно уродливым if(_something_) _ , то, что пробел выглядит ужасно. В любом случае, этот вопрос должен быть закрыт.

4. Зависит от типа varName

5. @iharob Для тебя это некрасиво, и я знаю, что это твое мнение, и я его уважаю, но для меня так удобнее. И почему «этот вопрос должен быть закрыт»? Я имею в виду, что эта платформа не помогает найти решение для людей, у которых проблемы с кодированием или программированием? Если вы хотите закрыть этот вопрос, потому что вы не учитываете пробелы в операторе if, это не означает, что вопрос должен быть закрыт.

Ответ №1:

В случае производительности нет разницы, но разница в намерениях может быть значительной. Предполагая, что NULL макрос определен как (void *) 0 , этот код:

 if( varName != NULL ) {
   // Do something
}
  

принудительно это varName должен быть объект-указатель. Например, следующий код выдаст сообщение об ошибке:

 int varName = 0;
if ( varName != NULL ) {
    // Do something
}
  

ошибка: сравнение между указателем и целым числом

Следовательно, эту практику можно рассматривать как своего рода защитное программирование, хотя ее ценность довольно обсуждаема, поскольку обе формы одинаково идиоматичны.

Комментарии:

1. И это делает код более читаемым. Просматривая код и видя сравнение с NULL , вы знаете, что тип является указателем, а не целочисленным типом, не находя объявление переменной.

2. @Флюгер: сомнительное преимущество, чем-то похожее на привычку приводить результат malloc . Сторонники последнего также часто утверждают, что это помогает им «знать тип, не находя объявление». На самом деле «знание типа» — это пресловутый костыль, который часто нужен разработчикам C, чтобы иметь возможность «ходить». Я бы сказал, что хорошие методы программирования требуют не зависящего от типа кода. Да, даже в C. Это более читабельно. Разработчикам просто нужно научиться читать и понимать такой независимый от типа код, не полагаясь на точную информацию о типе, нужно научиться ходить без костылей.

3. @AnT ваша аналогия с приведением malloc совсем не то же самое. Это аргумент соломенного человечка , наряду с вашим намеком на то, что я не могу ходить без костылей.