为什么在变量之前将常量放在比较中?

Rom*_*n M 18 c c++ syntax comparison

我在一些代码中注意到了一段时间的以下语法:

if( NULL == var){
   //...
}
Run Code Online (Sandbox Code Playgroud)

要么

if( 0 == var){
  //...
}
Run Code Online (Sandbox Code Playgroud)

和类似的事情.

有人可以解释为什么写这个的人选择这种符号而不是常用的var == 0方式)?

这是一种风格问题,还是以某种方式影响性能?

Rob*_*ble 33

这是一种避免这样的错误的机制:

if ( var = NULL ) {
  // ...
}
Run Code Online (Sandbox Code Playgroud)

如果您在右侧使用变量名称编写它,编译器将能够捕获某些错误:

if ( NULL = var ) {  // not legal, won't compile
  // ...
}
Run Code Online (Sandbox Code Playgroud)

当然,如果变量名出现在等号的两边,并且有些人发现这种风格没有吸引力,那么这将不起作用.

编辑:

正如Evan在评论中提到的,如果您启用警告,任何体面的编译器都会警告您,例如,gcc -Wall会给您以下内容:

warning: suggest parentheses around assignment used as truth value
Run Code Online (Sandbox Code Playgroud)

您应始终在编译器上启用警告,这是查找错误的最便宜方式.

最后,正如Mike B所指出的,这是一个风格问题,并不影响程序的性能.

  • 大多数物有所值的编译器都会在第一个示例中向您发出警告。 (3认同)
  • 您不仅应该在编译器上启用警告 - 您还应该注意它们,并修改代码以使警告不再出现。否则,您最终会得到带有数千条警告的构建......这真是一个痛苦。(我正在研究这样的一个 - 它激怒了我!) (2认同)
  • 当我说“修改代码”时,我的意思不仅仅是“插入随机转换直到警告停止”,这是对如何修复大量编译器警告的常见误解。 (2认同)

Kie*_*eli 11

如果你错了

if ( var = NULL )
Run Code Online (Sandbox Code Playgroud)

代替

if ( var == NULL )
Run Code Online (Sandbox Code Playgroud)

然后只会有编译器警告.如果您颠倒订单:

if ( NULL == var )
Run Code Online (Sandbox Code Playgroud)

如果你把它放在一个编译器错误

if ( NULL = var )
Run Code Online (Sandbox Code Playgroud)

就个人而言,我讨厌阅读这样编写的代码,而我在编码的第一年里只犯了一次错误.=)

  • 这就是为什么我的学生需要使用-Wall -Werror进行编译的原因。所以我不必阅读丑陋的东西:-) (2认同)

jpo*_*poh 7

避免

if (var = NULL)
Run Code Online (Sandbox Code Playgroud)

窃听器


Fed*_*oni 5

引用乔尔论软件,《游击面试指南》

有时,您会看到C程序员编写类似if(0 == strlen(x))的内容,将常量放在==的左侧。这是一个非常好的迹象。这意味着他们将=和==混淆了太多次,并强迫自己学习新的习惯来避免这种陷阱。

(我并不是这种“最佳实践”的忠实拥护者。)

  • 呵呵,(0 == strlen(x))实际上是一个不好的符号,('\ 0'== x [0])会很不错:) (2认同)

Ate*_*ral 5

推论:尽可能多地使用const

const int val = 42;

if (val = 43) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

将无法编译。

  • 我全力支持使用const,但是您通常不会像检查实际更改的变量那样经常检查常量变量的值,因此我不知道这对实际有多大帮助。避免此类错误的最简单方法是启用编译器警告。 (2认同)
  • 罗伯特,这些是 C 和 C++ 之间的巨大差异:/ 在 C++ 中 +ptr 是可能的并产生右值。 (2认同)