将常量放在if语句中的原因是什么?

Jon*_*age 60 c++ if-statement coding-style constants

我正在查看我正在使用的硬件接口的一些示例C++代码,并注意到以下几行中的许多语句:

if ( NULL == pMsg ) return rv;
Run Code Online (Sandbox Code Playgroud)

我敢肯定我听过有人说将常数放在第一位是一个好主意,但为什么呢?是否只是如果你有一个大的声明,你可以很快看到你正在比较什么,或者还有更多吗?

小智 81

这样就不会将比较(==)与赋值(=)混合在一起.

如您所知,您无法分配常量.如果你试试,compliler会给你一个错误.

基本上,它是防御性编程技术之一.保护自己免受自己伤害.


小智 30

阻止你写作:

 if ( pMsg = NULL ) return rv;
Run Code Online (Sandbox Code Playgroud)

因为失误.一个好的编译器会警告你这一点,所以大多数人不会使用"常量优先"的方式,因为他们发现很难阅读.

  • +1提及现代编译器无论如何警告这一点.在C++中不这样做的另一个原因是避免使用写入不当的运算符重载导致的陷阱.(`_bstr_t`,哦,我多么讨厌你.) (8认同)
  • 如果你真的想要一个赋值,大多数编译器会通过使用双括号来抑制警告:`if((pMsg = NULL))return rv;` (2认同)

Dan*_*ath 9

它会停止single = assignment bug.

例如,

if ( NULL = pMsg ) return rv;
Run Code Online (Sandbox Code Playgroud)

不会编译,在哪里

if ( pMsg =  NULL) return rv;
Run Code Online (Sandbox Code Playgroud)

会编译并让你头疼


jam*_*lin 8

为了澄清我在一些注释中所写的内容,这里有一个不在 C++代码中执行此操作的原因.

有人写了一个字符串类,并决定将一个强制转换运算符添加到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;
};
Run Code Online (Sandbox Code Playgroud)

现在有人盲目地应用constant == variable"防御性"编程模式:

BadString s("foo");

if ("foo" == s) // Oops.  This compares pointers and is never true.
{
   // ...
}
Run Code Online (Sandbox Code Playgroud)

这是IMO,比意外分配更隐蔽的问题,因为你无法从呼叫网站告诉任何事情显然是错误的.

当然,真正的教训是:

  1. 不要编写自己的字符串类.
  2. 避免使用隐式转换运算符,尤其是在执行(1)时.

但有时你正在处理你无法控制的第三方API.例如,_bstr_tWindows COM编程中常见的字符串类受此缺陷的影响.


liw*_*iwp 7

当常量为第一个时,编译器会在您意外写入时发出警告,=而不是==因为将值赋给常量是非法的.