2

等しいプロパティを含むことができるオブジェクトへの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へのポインタを初期化できますが、条件は保持されません。

第二に、治療すべき2つのケースがあります。

1)ポインタはコードロジックによって許可されていますNULL

この場合、2つのケースで異なる動作が必要になることは間違いありません。したがって、適切なのは次のとおりです。

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

2番目の構文は、意味的にはあまり意味がありません。つまり、がない場合にバインドされたロジックをユースケースにグループ化するのではなく、呼び出す前にNULLでないif ( ptr && ptr->foo() )ことを確認する必要があることを意味します。ptrfoo()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

私は読みやすさとメンテナンスの目的で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それはより明確で、理解しやすく、デバッグしやすく、あまり肥大化することはありません。

ただし、最初のものを使用する必要がある場合(場合によっては、いくつかのコーディングスタイルを使用する必要がある場合)、式の2つの部分を強調するために括弧を使用します。

// 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 に答える