Каковы причины, по которым сначала вводятся константы в операторы if?
Я смотрел на некоторый пример кода C++ для аппаратного интерфейса, с которым я работаю, и заметил много операторов в следующих строках:
if ( NULL == pMsg ) return rv;
Я уверен, что слышал, как люди говорят, что сначала поставить константу-хорошая идея, но почему это так? Это просто так, что если у вас есть большое заявление, вы можете быстро увидеть, с чем вы сравниваете, или есть еще что-то?
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).
но иногда вы имеете дело со сторонними API, которые вы не можете контролировать. Например,
_bstr_t
строковый класс, распространенный в программировании Windows COM, страдает от этого недостатка.
когда константа первая, компилятор предупредит вас, если вы случайно напишете
=
, а не==
так как это незаконно присвоить значение константе.
Они сказали,"чтобы предотвратить смешивание назначения и сравнения".
на самом деле я думаю, что это ерунда: если вы так дисциплинированный, что вы не забыли поставить константу на левой стороне, вы наверняка не перепутаете ' = 'с'==', не так ли? ;)
компиляторы вывода предупреждений-это хорошо, но некоторые из нас в реальном мире не могут позволить себе рассматривать предупреждения как ошибки. Изменение порядка переменных и констант означает, что этот простой промах всегда отображается как ошибка и предотвращает компиляцию. Вы очень быстро привыкаете к этому шаблону, и ошибка, от которой он защищает, является тонкой, которую часто трудно найти после введения.