2012-04-10 4 views
0

私は、2つの隣接するタプルを探してstd :: vectorを歩く比較的単純なアルゴリズムを持っています。 X値の左と右のタプルが見つかると、その間で補間できます。どういうわけか、この作品:この間なぜ2のNULLポインタがfalseに評価されないのですか?

std::vector<LutTuple*>::iterator tuple_it; 
    LutTuple* left = NULL; 
    LutTuple* right = NULL; 
    bool found = 0; 

    // Only iterate as long as the points are not found 
    for(tuple_it = lut.begin(); (tuple_it != lut.end() && !found); tuple_it++) { 
    // If the tuple is less than r2 we found the first element 
    if((*tuple_it)->r < r) { 
     left = *tuple_it; 
    } 
    if ((*tuple_it)->r > r) { 
     right = *tuple_it; 
    } 
    if(left && right) { 
     found = 1; 
    } 
    } 

std::vector<LutTuple*>::iterator tuple_it; 
    LutTuple* left = NULL; 
    LutTuple* right = NULL; 

    // Only iterate as long as the points are not found 
    for(tuple_it = lut.begin(); tuple_it != lut.end() && !left && !right; tuple_it++) { 
    // If the tuple is less than r2 we found the first element 
    if((*tuple_it)->r < r) { 
     left = *tuple_it; 
    } 
    if ((*tuple_it)->r > r) { 
     right = *tuple_it; 
    } 
    } 

はしていません。何故ですか?私は、このような2つのNULL ptrsが否定されたときに一緒に真に評価されると期待します。

+6

http://en.wikipedia.org/wiki/De_Morgan's_laws – HostileFork

答えて

4

論理的な問題があります。

最初のスニペットには、(本質的に)!(left && right)があります。

2番目のスニペットには、!left && !rightがあります。

これらは同等ではありません。

真理値表を作成すると、!(left && right)(!left || !right)に相当します。

+0

ありがとう、これは私のためにそれをクリア! – Julik

5

2番目のループは、いずれかが見つかるとすぐに終了します。条件を変更します。両方が発見されるまで

tuple_it != lut.end() && !(left && right) 

または

tuple_it != lut.end() && (!left || !right) 

を継続します。

0

が無効になったときに、このような2つのNULL ptrsが真であると評価すると思います。

これは意味をなさない。ポインタを「無効」にして、ブール式に強制されたときに評価するものを期待しないでください。代わりに、明示的にそれらをNULLと比較することをお勧めします。

また、ループを継続するための複雑なブール式を別の行に移動します。そうしないと、コードを論理的に追跡することが非常に困難になります。

+2

ポインタからブール値への標準変換は明確に定義されています。それを使用するか明示的に比較するかの選択は、純粋に審美的です。 –

+0

@Mike、私の答えは、可読性ではなく、正確さを扱っています。私は、コードが書かれているように「正しく」動作することを確信しています。それは、著者が期待していることを行わないということだけです。問題は、読みやすく、エラーを起こしにくいことです。 –

+1

標準の変換が読みやすく、エラーが起こりにくいと簡単に主張することもできます。選択は純粋に審美的であり、あなたの個人的な好みはこの質問とは無関係です。 –

関連する問題