Каковы причины, по которым сначала вводятся константы в операторы if?


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

if ( NULL == pMsg ) return rv;

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

8 57

8 ответов:

Так что вы не смешивать сравнения (==) с присваиванием (=).

Как вы знаете, вы не можете назначить постоянный. Если вы попытаетесь, комплиментатор выдаст вам ошибку.

в основном, это один из методов защитного программирования. Чтобы защитить себя от самого себя.

чтобы вы не писали:

 if ( pMsg = NULL ) return rv;

по ошибке. Однако хороший компилятор предупредит вас об этом, поэтому большинство людей не используют способ "константа первая", поскольку им трудно читать.

Он останавливает ошибку single = assignment.

например,

if ( NULL = pMsg ) return rv;

не будет компилироваться, где как

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, страдает от этого недостатка.

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

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

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

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

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