我在一些代码中注意到了一段时间的语法:
if( NULL == var){
//...
}
或
if( 0 == var){
//...
}
和类似的事情。
有人可以解释为什么写这篇文章的人选择这种符号而不是通用var == 0
方式?
这是一种风格问题,还是以某种方式影响表现?
答案 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) {