Каково обоснование позади вставления констант если операторы сначала?

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

if ( NULL == pMsg ) return rv;

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

60
задан Jon Cage 26 January 2010 в 10:18
поделиться

8 ответов

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

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

В основном это один из методов защиты защиты. Защитить себя от себя.

80
ответ дан 24 November 2019 в 17:38
поделиться

Чтобы не смешивать сравнение (= =) с присвоением (=).

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

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

-121--967912-

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

-121--967916-

Чтобы не дать вам написать:

 if ( pMsg = NULL ) return rv;

по ошибке. Хороший компилятор предупредит вас об этом, однако, поэтому большинство людей не используют «постоянный первый» способ, так как им трудно читать.

30
ответ дан 24 November 2019 в 17:38
поделиться

Это останавливает один = ошибка присваивания.

Например,

if ( NULL = pMsg ) return rv;

не будет компитен, где as

if ( pMsg =  NULL) return rv;

соберет и даст вам головные боли

8
ответ дан 24 November 2019 в 17:38
поделиться

Чтобы уточнить то, что я написал в некоторых комментариях, вот причина не , чтобы сделать это в коде C ++.

Кто-то пишет, скажем, класс String и решает добавить литого оператора в 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;
};

Теперь кто-то слепо применяет константу == переменная Шаблон программирования:

BadString s("foo");

if ("foo" == s) // Oops.  This compares pointers and is never true.
{
   // ...
}

Это, ИМО, более коварная проблема, чем случайное задание, потому что вы не можете сказать с сайта вызова, что что-либо явно не так.

Конечно, реальные уроки:

  1. Не записывайте свои собственные строковые классы.
  2. Избегайте неявных литых операторов, особенно при выполнении (1).

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

8
ответ дан 24 November 2019 в 17:38
поделиться

Возможно, нет, но вы можете попробовать написать свой собственный плагин Resharper

-121--1863564-

, чтобы не смешивать сравнение (=) с назначением (=).

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

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

-121--967912-

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

7
ответ дан 24 November 2019 в 17:38
поделиться

Я забываю в статье, но цитата пошла что-то вроде: «Очевидно, что его проще вспомнить, чтобы сначала поставить постоянную, чем это запоминание, чтобы использовать ==»;;))

0
ответ дан 24 November 2019 в 17:38
поделиться

В IE7 можно вызвать firebug lite для текущей страницы, вставив в адресную строку следующее:

javascript:var firebug=document.createElement('script');firebug.setAttribute('src','http://getfirebug.com/releases/lite/1.2/firebug-lite-compressed.js');document.body.appendChild(firebug);(function(){if(window.firebug.version){firebug.init();}else{setTimeout(arguments.callee);}})();void(firebug);

См. http://getfirebug.com/lite.html .

-121--659805-

Можете ли вы попробовать 127,0,0,1 в качестве имени сервера вместо localhost ?

IIRC, с некоторыми драйверами/адаптерами mySQL, решает, используется ли сокет для установления соединения или нет.

-121--2330369-

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

2
ответ дан 24 November 2019 в 17:38
поделиться

Даже если вы можете получить время от GPS, вы должны знать, что GPS время не совсем то же самое, что UTC. GPS-приемник в iPhone может позаботиться об этом для вас.

-121--3678057-

Процесс скрытия деталей реализации называется Инкапсуляция . Процесс минимизации зависимостей сборки для пользователей называется Изоляция . Существует большая (но стареющая) книга Джона Лакоса, посвященная обеим темам:

http://www.amazon.com/Large-Scale-Software-Design-John-Lakos/dp/0201633620

-121--4293897-

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

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

2
ответ дан 24 November 2019 в 17:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: