编码样式 - 如果条件在NULL内部检查后调用指针

时间:2012-10-16 12:21:56

标签: c++ if-statement coding-style

假设我们有两个指向可以包含属性相等的对象的指针,我们想要检查它。但首先,我们需要检查指针是否已初始化。 通常首选什么选项?它会对性能产生一些微观影响吗?

if(p1 && p2 && p1->getA() == p2->getB()){
    execute fancy code
}

或:

if(p1 && p2){
    if(p1->getA() == p2->getB()){
        execute fancy code
    }
}

我想知道通常喜欢什么。

提前致谢。

4 个答案:

答案 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
    }
}

当我正在调试时,陷入太多条件的行是非常麻烦的,因为不清楚条件会使整个事情变为truefalse而不检查每个子一下子。但是当每个相关条件都在分开的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()语句生成相同的代码。