28

一段时间以来,我注意到我们的一些代码中有以下语法:

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

或者

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

和类似的事情。

有人可以解释一下为什么写这篇文章的人选择这种表示法而不是常用的var == 0方式)?

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

4

7 回答 7

40

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

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

于 2008-12-16T03:20:31.983 回答
12

如果你错误地放

if ( var = NULL )

代替

if ( var == NULL )

那么只会有一个编译器警告。如果您颠倒顺序:

if ( NULL == var )

那么如果你放,就会出现编译器错误

if ( NULL = var )

就个人而言,我讨厌阅读以这种方式编写的代码,而且我在编码的第一年只犯过一次这个错误。=)

于 2008-12-16T03:26:23.220 回答
7

为了避免

if (var = NULL)

漏洞

于 2008-12-16T03:17:57.200 回答
7

推论:尽可能多地使用const

const int val = 42;

if (val = 43) {
    ...
}

不会编译。

于 2008-12-16T05:20:00.243 回答
5

引用 Joel On Software,游击队面试指南

偶尔,您会看到 C 程序员编写类似 if (0==strlen(x)) 的内容,将常量放在 == 的左侧。这真是一个好兆头。这意味着他们因混淆 = 和 == 而被刺痛了太多次,并强迫自己学习一个新习惯以避免那个陷阱。

(我不太喜欢这种“最佳实践”。)

于 2008-12-16T03:25:30.427 回答
1

顺便说一句,多年来我观察到向新程序员教授 C 语言,如果你训练自己将“=”读为“gets”,将“==”读为等于,这本身就可以让你免于许多这样的问题错误。然后你读

if( x = 0){

就像“如果 x 得到 0 那么”,这听起来很奇怪。

于 2008-12-16T03:29:05.973 回答
1

就个人而言,我更喜欢

if (!x) {

于 2008-12-16T05:11:23.677 回答