Каковы причины, по которым сначала вводятся константы в операторы if?
Я смотрел на некоторый пример кода C++ для аппаратного интерфейса, с которым я работаю, и заметил много операторов по следующим строкам:
if ( NULL == pMsg ) return rv;
Я уверен, что слышал, как люди говорят, что поставить константу на первое место-хорошая идея, но почему? Это просто для того, чтобы, если у вас есть большое утверждение, Вы могли быстро увидеть, с чем вы сравниваете, или есть что-то еще?
8 ответов
чтобы вы не смешивали сравнение ( = = ) с назначением (=).
Как вы знаете, вы не можете назначить постоянный. Если вы попытаетесь, compliler даст вам ошибку.
в принципе, это один из методов безопасного программирования. Чтобы защитить себя от самого себя.
мешает написать:
if ( pMsg = NULL ) return rv;
по ошибке. Однако хороший компилятор предупредит вас об этом, поэтому большинство людей не используют "постоянный первый" способ, поскольку им трудно читать.
Он останавливает ошибку single = assignment.
например,
if ( NULL = pMsg ) return rv;
не компилируется, где as
if ( pMsg = NULL) return rv;
будет компилироваться и даст вам головные боли
чтобы уточнить, что я написал в некоторых комментариях, вот причина не чтобы сделать это в коде C++.
кто-то пишет, скажем, класс string и решает добавить оператор cast в const char*
:
class BadString
{
public:
BadString(const char* s) : mStr(s) { }
operator const char*() const { return mStr.c_str(); }
bool operator==(const BadString& s) { return mStr == s.mStr; }
// Other stuff...
private:
std::string mStr;
};
сейчас кто-то слепо применяет constant == variable
"оборонительный" шаблон программирования:
BadString s("foo");
if ("foo" == s) // Oops. This compares pointers and is never true.
{
// ...
}
это, ИМО, более коварная проблема, чем случайное назначение, потому что вы не можете сказать с сайта вызова, что что-то очевидно неправильный.
конечно, настоящие уроки:
- не пишите свои собственные классы строк.
- избегайте неявных операторов приведения, особенно при выполнении (1).
но иногда вы имеете дело со сторонними API, которые вы не можете контролировать. Например,_bstr_t
строковый класс, распространенный в программировании Windows COM, страдает этим недостатком.
когда константа первая, компилятор предупредит вас, если вы случайно напишете =
, а не ==
С незаконно присвоить значение константе.
Они сказали, "предотвратить смешивать назначения и сравнения".
на самом деле я думаю, что это ерунда: если вы так дисциплинированный, что вы не забудьте поставить константу на левой стороне, вы наверняка не будет путать ' = ' с '==', не так ли? ;)
компиляторы вывода предупреждений-это хорошо, но некоторые из нас в реальном мире не могут позволить себе рассматривать предупреждения как ошибки. Изменение порядка переменных и констант означает, что этот простой промах всегда отображается как ошибка и предотвращает компиляцию. Вы очень быстро привыкаете к этому шаблону, и ошибка, от которой он защищает, тонкая, которую часто трудно найти после введения.
Я забыл статью, но цитата пошла что-то вроде: "очевидно, его легче запомнить, чтобы поставить константу первым, чем он помнит использовать ==" ;))