为什么在变量之前将常量置于比较中?
我在一些代码中注意到了一段时间的以下语法:
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) {