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

时间:2008-12-16 03:14:23

标签: c++ c syntax comparison

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

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

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

和类似的事情。

有人可以解释为什么写这篇文章的人选择这种符号而不是通用var == 0方式?

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

7 个答案:

答案 0 :(得分:28)

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

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指出的那样,这是一种风格问题,不会影响程序的性能。

答案 1 :(得分:8)

如果你错误地把

if ( var = NULL )

而不是

if ( var == NULL )

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

if ( NULL == var )

然后如果你输入

就会出现编译错误
if ( NULL = var )

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

答案 2 :(得分:5)

避免

if (var = NULL)

错误

答案 3 :(得分:3)

引用Joel On Software,The Guerrilla Guide to Interviewing

  

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

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

答案 4 :(得分:3)

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

const int val = 42;

if (val = 43) {
    ...
}

不会编译。

答案 5 :(得分:1)

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

if( x = 0){

as“如果x变为0然后”并且开始听起来很奇怪。

答案 6 :(得分:1)

就个人而言,我更喜欢

if (!x) {