Подтвердить что ты не робот

Какова аргументация, заключающаяся в том, чтобы сначала поставить константы в утверждениях if?

Я смотрел пример кода на С++ для аппаратного интерфейса, с которым я работаю, и заметил множество утверждений в следующих строках:

if ( NULL == pMsg ) return rv;

Я уверен, что слышал, что люди говорят, что сначала поставить константу - хорошая идея, но почему? Это просто так, что, если у вас есть большое выражение, вы можете быстро увидеть, что вы сравниваете, или есть еще больше?

4b9b3361

Ответ 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

Я забыл статью, но в цитате было что-то вроде: "Очевидно, что ее легче помнить, чтобы сначала поставить константу, чем она помнит, использовать ==";))