Какова аргументация, заключающаяся в том, чтобы сначала поставить константы в утверждениях if?
Я смотрел пример кода на С++ для аппаратного интерфейса, с которым я работаю, и заметил множество утверждений в следующих строках:
if ( NULL == pMsg ) return rv;
Я уверен, что слышал, что люди говорят, что сначала поставить константу - хорошая идея, но почему? Это просто так, что, если у вас есть большое выражение, вы можете быстро увидеть, что вы сравниваете, или есть еще больше?
Ответы
Ответ 1
Чтобы вы не смешивали сравнение (==) с присваиванием (=).
Как вы знаете, вы не можете назначить константу. Если вы попытаетесь, компилятор даст вам сообщение об ошибке.
В принципе, это один из защитных методов программирования. Чтобы защитить себя от себя.
Ответ 2
Чтобы остановить запись:
if ( pMsg = NULL ) return rv;
по ошибке. Хороший компилятор предупредит вас об этом, поэтому большинство людей не используют "постоянный первый" способ, так как им трудно читать.
Ответ 3
Он останавливает ошибку single = assign.
Например,
if ( NULL = pMsg ) return rv;
не будет компилироваться, где
if ( pMsg = NULL) return rv;
скомпилирует и даст вам головные боли
Ответ 4
Чтобы пояснить, что я написал в некоторых комментариях, вот причина не делать этого в коде на С++.
Кто-то пишет, скажем, строковый класс и решает добавить оператор трансляции к 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, страдает от этого недостатка.
Ответ 5
Когда константа первая, компилятор предупредит вас, если вы случайно напишете =
, а не ==
, так как это незаконно присвоить значение константе.
Ответ 6
Они сказали: "Чтобы предотвратить смешение присвоения и сравнения".
На самом деле я думаю, что это бессмыслица: если вы настолько дисциплинированы, что не забываете ставить постоянную с левой стороны, вы определенно не будете смешивать '=' с '==', не так ли?;)
Ответ 7
Компиляторы, выводящие предупреждения, хороши, но некоторые из нас в реальном мире не могут позволить себе рассматривать предупреждения как ошибки. Реверсирование порядка переменных и констант означает, что этот простой промах всегда отображается как ошибка и предотвращает компиляцию. Вы привыкаете к этому шаблону очень быстро, и ошибка, которую он защищает, является тонкой, которая часто бывает трудно найти после введения.
Ответ 8
Я забыл статью, но в цитате было что-то вроде: "Очевидно, что ее легче помнить, чтобы сначала поставить константу, чем она помнит, использовать ==";))