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

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

if( NULL == var){ //... } 

要么

 if( 0 == var){ //... } 

和类似的事情。

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

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

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

 if ( var = NULL ) { // ... } 

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

 if ( NULL = var ) { // not legal, won't compile // ... } 

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

编辑:

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

 warning: suggest parentheses around assignment used as truth value 

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

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

如果你错了

 if ( var = NULL ) 

代替

 if ( var == NULL ) 

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

 if ( NULL == var ) 

如果你把,那么将会出现编译器错误

 if ( NULL = var ) 

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

避免

 if (var = NULL) 

窃听器

引用Joel On Software, The Guerrilla采访指南 :

有时候,你会看到一个C程序员写了if(0 == strlen(x))之类的东西,把常量放在==的左边。 这是一个非常好的迹象。 这意味着他们被混淆=和==曾多次被蜇,并迫使自己学习一种习惯来避免这种陷阱。

(我不是这个“最佳实践”的粉丝。)

推论:尝试尽可能多地使用const

 const int val = 42; if (val = 43) { ... } 

不会编译。

顺便说一下,我已经观察了很多年来向新程序员教授C,如果你训练自己把“=”作为“得到”和“==”等同,那本身就会让你免于这些错误。 然后你看了

 if( x = 0){ 

如果“如果x得到0然后”,那开始听起来很奇怪。

就个人而言,我更喜欢

if (!x) {