我观察到很多程序员在编写条件语句时都会做这样的事情
if(NULL == Ptr){
//Some code
}
代替if(Ptr == NULL){ //some code ...
这种编码实践背后的原因是什么?我相信它无论如何都不会改变语句的含义,那么为什么要这样写呢?
如果我犯了错误,请指出我。
我观察到很多程序员在编写条件语句时都会做这样的事情
if(NULL == Ptr){
//Some code
}
代替if(Ptr == NULL){ //some code ...
这种编码实践背后的原因是什么?我相信它无论如何都不会改变语句的含义,那么为什么要这样写呢?
如果我犯了错误,请指出我。
这样做的通常原因是,如果代码被错误地写成
if(NULL = Ptr){
//Some code
}
这将是一个编译错误,而不仅仅是一个语义错误。
正如 ouah 和 Bo Persson 所指出的,这在很大程度上是不必要的,因为现代编译器已经重新集成了过去被委托给单独lint
程序的大部分语义检查。
gcc -Wall -Wextra
会告诉你这条线看起来很可疑:
test.c:3:2: warning: suggest parentheses around assignment used as truth value
我不像 ouah 那样认为它在语义上是错误的,比较是可交换的(即使通过减法实现并测试非零)。但它确实使代码的可读性降低,如果你打算大声朗读它,也许是给一个审查组。
If NULL is-equal-to pointer then
Block comment (some code) end-Block
这样读起来很有趣。然而
If pointer is-equal-to NULL ...
耳朵更顺滑。
if(NULL == Ptr)
相当于
if(Ptr == NULL)
因为==
运算符是可交换的。NULL = Ptr
这种形式的想法是如果程序员在他的意思时写错了,就会触发编译器错误NULL == Ptr
。
这种方法的问题是恕我直言,它使代码的可读性降低,并且在语义上不正确,因为您想要比较Ptr
而NULL
不是相反。
此外,任何启用警告的体面编译器都会触发带有if (Ptr = NULL)
.
它做同样的事情,但我觉得它令人困惑,因为要保持一致,你还需要写
if (0 > a)
代替
if (a < 0)
这通常令人困惑,因为有文档或其他内容描述“a 必须小于零”,而不是“零必须大于 a”。