当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《为什么在变量之前将常量放在比较中?》经验,为你挑选了5个好方法。

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

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

要么

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

和类似的事情.

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

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



1> Robert Gambl..:

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

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



2> Kieveli..:

如果你错了

if ( var = NULL )

代替

if ( var == NULL )

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

if ( NULL == var )

如果你把它放在一个编译器错误

if ( NULL = var )

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


这就是为什么我的学生需要使用-Wall -Werror进行编译的原因。所以我不必阅读丑陋的东西:-)

3> jpoh..:

避免

if (var = NULL)

窃听器



4> Federico A. ..:

引用乔尔论软件,《游击面试指南》:

有时,您会看到C程序员编写类似if(0 == strlen(x))的内容,将常量放在==的左侧。这是一个非常好的迹象。这意味着他们将=和==混淆了太多次,并强迫自己学习新的习惯来避免这种陷阱。

(我并不是这种“最佳实践”的忠实拥护者。)


呵呵,(0 == strlen(x))实际上是一个不好的符号,('\ 0'== x [0])会很不错:)

5> Ates Goral..:

推论:尽可能多地使用const

const int val = 42;

if (val = 43) {
    ...
}

将无法编译。


我全力支持使用const,但是您通常不会像检查实际更改的变量那样经常检查常量变量的值,因此我不知道这对实际有多大帮助。避免此类错误的最简单方法是启用编译器警告。
推荐阅读
linjiabin43
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有