tyu*_*980 8 c++ coding-style conditional-statements
使用有什么区别:
if (NULL == pointer)
Run Code Online (Sandbox Code Playgroud)
和使用:
if (pointer == NULL)
Run Code Online (Sandbox Code Playgroud)
我的教授说使用前者而不是后者,但我看不出两者之间的区别.
Sha*_*our 15
没有区别.你的教授更喜欢的是Yoda条件,也可以看到"尤达条件","神奇宝贝异常处理"和其他编程经典.
它应该在比较中防止使用赋值(=)错误地使用equality(==),但是现代编译器现在应该警告这一点,所以不应该需要这种类型的防御性编程.例如:
if( pointer = NULL )
Run Code Online (Sandbox Code Playgroud)
将分配NULL给pointer程序员真正意味着什么:
if( pointer == NULL )
Run Code Online (Sandbox Code Playgroud)
它应该是一个比较,哎呀.使用Yoda条件将其设为错误(请参见实时),并向此发出类似消息:
错误:表达式不可分配
正如jrok指出的那样:
if (!pointer)
Run Code Online (Sandbox Code Playgroud)
在这种情况下,一起避免这个问题.
这是一个具体的例子,为什么现代编译器我们不再需要这种技术了(现场观看):
#include <iostream>
int main()
{
int *ptr1 = NULL ;
if( ptr1 = NULL )
{
std::cout << "It is NULL" << std::endl ;
}
}
Run Code Online (Sandbox Code Playgroud)
请注意所有警告:
warning: using the result of an assignment as a condition without parentheses [-Wparentheses]
if( ptr1 = NULL )
~~~~~^~~~~~
note: place parentheses around the assignment to silence this warning
if( ptr1 = NULL )
^
( )
use '==' to turn this assignment into an equality comparison
if( ptr1 = NULL )
^
==
Run Code Online (Sandbox Code Playgroud)
这让人很难错过这个问题.值得注意的是,在C++中, nullptr应该是首选NULL,你可以看一下使用nullptr有什么好处?了解所有细节.
注意,在C++中,运算符重载的可能性很小,可能存在一些人为的不一样的情况.
注意,-Wparentheses警告在某些方面强制选择样式,您需要在生成警告的位置放弃对赋值的潜在有效使用,例如,如果您使用-Werror或选择对这些情况进行括号化,有些可能会发现丑陋如下面的评论所示.我们可以在打开的警告gcc和clang使用-Wno-parentheses,但我不会建议的选择,因为在一般的警告将显示一个真正的错误.