假设我们有两个指向可以包含属性相等的对象的指针,我们想要检查它。但首先,我们需要检查指针是否已初始化。 通常首选什么选项?它会对性能产生一些微观影响吗?
if(p1 && p2 && p1->getA() == p2->getB()){
execute fancy code
}
或:
if(p1 && p2){
if(p1->getA() == p2->getB()){
execute fancy code
}
}
我想知道通常喜欢什么。
提前致谢。
答案 0 :(得分:4)
首先,if (ptr)
不检查指针是否已初始化,它会检查它是否为NULL。您可以将指针初始化为NULL,并且条件不会成立。
其次,有两种情况需要处理:
1)代码逻辑允许指针为NULL
在这种情况下,您肯定希望这两种情况有不同的行为。那么适当的是:
if ( ptr )
{
ptr->foo();
//...
}
else
{
//...
}
第二种语法在语义上没有多大意义if ( ptr && ptr->foo() )
意味着您希望在调用ptr
之前确保foo()
不为NULL,而不是将绑定的逻辑分组到用例foo
不是false
的情况。
2)指针不允许为NULL
如果他们不被允许NULL
,那么您应该处理他们NULL
的情况,而不是完全排除它,这就是
if ( ptr && ptr->foo() )
一样。但是让它燃烧:
if ( !ptr )
throw std::exception("WTF! This shouldn't be NULL");
ptr && ptr->foo()
似乎是为了防止崩溃,但同时隐藏错误。在干净的逻辑中,您不需要检查NULL
。如果没有创建对象并且指针没有指向任何有意义的东西,那么无论你是否调用foo
都会有错误,所以你应该处理它,而不是将它隐藏在支票后面
答案 1 :(得分:3)
表现 - 没有区别。在每种情况下,编译器几乎肯定会产生相同的代码。
就个人而言,我更喜欢前者更为惯用。您非常经常在C / C ++中看到这样的代码:
if (ptr && *ptr == x)
你所写的内容只是其中的一小部分。
答案 2 :(得分:2)
我更喜欢第二个用于易读性和维护目的:
// First thing is to check the pointers
if(p1 && p2){
// Second thing is call the getters.
if(p1->getA() == p2->getB()){
// execute fancy code
}
}
当我正在调试时,陷入太多条件的行是非常麻烦的,因为不清楚条件会使整个事情变为true
或false
而不检查每个子一下子。但是当每个相关条件都在分开的if
时,它更清晰,更容易理解,更容易调试,而且不会很膨胀。
但是,如果我被迫使用第一个(有时你被迫使用一些编码风格),我将使用括号来强调表达式的两个部分:
// Look: FIRST check the pointers and...
// and THEN call the getters.
if ( (p1 && p2) && (p1->getA() == p2->getB()) ){
// execute fancy code
}
答案 3 :(得分:0)
我更喜欢if((p1 != NULL) && (p2 != NULL) && (p1->getA() == p2->getB())){ }
。使用括号使代码直截了当并消除“猜测”优先级。比IMPLICIT明显是要走的路。任何体面的生产级编译器都会为if()语句生成相同的代码。