2

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

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

或者:

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

我想知道通常首选的是什么。

提前致谢。

4

4 回答 4

4

首先,if (ptr)不检查指针是否被初始化,它检查它是否不是 NULL。您可以初始化一个指向 NULL 的指针并且条件不成立。

其次,有两种情况需要处理:

1)代码逻辑允许指针是NULL

在这种情况下,您肯定希望这两种情况有不同的行为。所以合适的是:

if ( ptr )
{  
   ptr->foo();
   //...
}
else
{
   //...
}

第二种语法在语义上没有多大意义if ( ptr && ptr->foo() ),意味着您希望ptr在调用之前确定 is not NULL ,而不是将绑定到is notfoo()的情况的逻辑分组到用例中。foofalse

2)指针不允许NULL

如果不允许它们存在NULL,那么您应该处理它们存在的情况,而NULL不是完全排除它,这就是

if ( ptr && ptr->foo() )

做。但是通过让它燃烧:

if ( !ptr )
    throw std::exception("WTF! This shouldn't be NULL");

ptr && ptr->foo()似乎它是为了防止崩溃,但同时隐藏错误。在一个干净的逻辑中,您不需要检查NULL. 如果对象没有被创建并且指针没有指向任何有意义的东西,那么无论你是否调用,你都会遇到一个错误foo,所以你应该处理它,而不是把它隐藏在检查之后。

于 2012-10-16T12:26:34.603 回答
3

性能 - 没有区别。编译器几乎肯定会在每种情况下生成相同的代码。

就个人而言,我更喜欢前者,因为它更惯用。你经常在 C/C++ 中看到这样的代码:

if (ptr && *ptr == x)

你写的只是这个的一个小扩展。

于 2012-10-16T12:24:17.243 回答
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的 s 中时,它会更清晰、更容易理解、更容易调试并且不会很臃肿。

但是,如果我被迫使用第一个(有时你被迫使用一些编码风格),我将使用括号来强调表达式的两个部分:

// Look: FIRST check the pointers and...
// and THEN call the getters.
if ( (p1 && p2) && (p1->getA() == p2->getB()) ){
    // execute fancy code
}
于 2012-10-16T12:37:10.083 回答
0

我更喜欢if((p1 != NULL) && (p2 != NULL) && (p1->getA() == p2->getB())){ }. 使用括号使代码直截了当,并消除了“猜测”优先级。显式比隐式是要走的路。任何体面的生产级编译器都会为两个 if() 语句生成相同的代码。

于 2012-10-16T12:35:06.607 回答