Каковы причины, по которым сначала вводятся константы в операторы 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. не пишите свои собственные классы строк.
  2. избегайте неявных операторов приведения, особенно при выполнении (1).

но иногда вы имеете дело со сторонними API, которые вы не можете контролировать. Например,_bstr_t строковый класс, распространенный в программировании Windows COM, страдает этим недостатком.


когда константа первая, компилятор предупредит вас, если вы случайно напишете =, а не == С незаконно присвоить значение константе.


Они сказали, "предотвратить смешивать назначения и сравнения".

на самом деле я думаю, что это ерунда: если вы так дисциплинированный, что вы не забудьте поставить константу на левой стороне, вы наверняка не будет путать ' = ' с '==', не так ли? ;)


компиляторы вывода предупреждений-это хорошо, но некоторые из нас в реальном мире не могут позволить себе рассматривать предупреждения как ошибки. Изменение порядка переменных и констант означает, что этот простой промах всегда отображается как ошибка и предотвращает компиляцию. Вы очень быстро привыкаете к этому шаблону, и ошибка, от которой он защищает, тонкая, которую часто трудно найти после введения.


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