2

この行で

if ((last_search == NULL) || (last_search != NULL && total_results != 0))

Cの短絡評価規則でlast_searchは、nullでない場合にのみ、の右側を評価しようとする||ため、次のように書くのと同じです。

if ((last_search == NULL) || (total_results != 0))

誰かから後者を使うように言われましたが、それでも前者の方が読みやすいのではないでしょうか。また、コンパイラは冗長性を最適化しませんlast_search != NULLか?

4

3 に答える 3

10

これは主観的なものですが、いいえ、最初のバリアントは、読むべきものがまだあるため、読みやすくありません。最も読みやすいコード(そして最もバグの少ないコード!)は、存在しないコードです。一度に3つか4つの条件をチェックしたい場合はどうなるか考えてみてください。

そして、ここに別の反例があります:あなたはこのようなコードを書きますか?

if (number < 0) {
}
else if(number >= 0) {
    // why not just "else"?
}

パフォーマンスに関しては、コンパイラーはおそらく冗長な呼び出しを最適化するでしょうが、パフォーマンスの低下を元に戻すことは読みやすさの低下を助けません。

于 2012-09-17T15:32:53.393 に答える
5

いいえ、ちがいます。2つ目は、はるかに読みやすくなっています。コンパイラがそれを最適化するかどうかに関係なく、なぜ冗長チェックをそこに保持するのでしょうか?

最初のバージョンは、それがそこに到達したためでlast_searchはないことを示していますが、最初の条件(失敗)NULLからそれを判断できない場合は、読みやすさよりも大きな問題が発生している可能性があります。last_search == NULL

于 2012-09-17T15:32:38.980 に答える
1

それを判読不能にするのは短絡評価だけでなく、余分な比較を使用するという事実でもあります。

if ( !last_search || total_results)

あなたが提案したものよりもはるかに読みやすいです。

于 2012-09-17T15:37:20.083 に答える