宗教的な議論はさておき:
オプション1:
if (pointer[i] == NULL) ...
オプション2:
if (!pointer[i]) ...
Cでは、option1は機能的にoption2と同等ですか?
比較がないため、後者の方が早く解決しますか?
私は2番目が好きで、他の人は1番目が好きです。
実際、私は最初のものよりも3番目の種類を好む:
_if (NULL == ptr) {
...
}
_
それで私は:
機能的には同等です。
NULL
ポインターが "0"(すべてゼロのビット)でない場合でも、if (!ptr)
はNULL
ポインターと比較されます。
以下は正しくありません。参照しているコメントが多いため、ここにあります:ただし、ポインタをリテラル0と比較しないでください。ほとんどどこでも動作しますが、動作は未定義ですIIRC。
私は明示的なスタイル(最初のバージョン)を好みます。これは、整数やその他のポインタではなく、関連するポインタがあることを明らかにしますが、それは単にスタイルの問題です。
パフォーマンスの観点からは、違いはありません。
同等。それは言語標準でそう言っています。そして人々は最も難しい宗教的な好みを持っています!
多くの場合、コンパイラの作成者は少なくとも最小限の知能を持っていると想定すると役立ちます。あなたのコンパイラはnot混乱したアヒルの子によって書かれています。何年にもわたるプログラミングの経験と、コンパイラー理論の研究に長年費やした人間によって書かれています。これは、コンパイラが完全であり、常に最良の知識を持っているという意味ではありませんが、doesは、簡単な自動最適化を完全に処理できることを意味します。
2つの形式が同等である場合、コンパイラがどちらか一方を同等に効率的にするために、なぜ一方をもう一方に変換しないのでしょうか。
if (pointer[i] == NULL)
がif (!pointer[i])
よりも遅い場合、コンパイラはそれを2番目のより効率的な形式に変更しませんか?
つまり、同等であると仮定すると、同等に効率的です。
質問の最初の部分については、はい、それらは同等です。言語標準は実際にどこかでこれを明示的に述べています-ポインターは、それがNULLでない場合はtrueに評価され、NULLの場合はfalseに評価されるため、2つはまったく同じです。
ほぼ間違いなくパフォーマンスに違いはありません。しかし、私は秒の暗黙のスタイルを好みます。
NULL
は、次のように標準ヘッダーファイルの1つで宣言する必要があります。
#define NULL ((void*)0)
したがって、どちらの方法でも、ゼロと比較していて、コンパイラーは両方を同じ方法で最適化する必要があります。すべてのプロセッサには、ゼロと比較するための「最適化」またはオペコードがあります。
初期の最適化は悪いです。マイクロ最適化も悪いです。CPUからHzの最後のすべてのビットを絞り込もうとしない限り、それを行っても意味がありません。人々がすでに示したように、コンパイラはとにかくほとんどのコードを最適化します。
コードをできるだけ簡潔で読みやすくするのが最善です。これがより読みやすい場合
if (!ptr)
これより
if (NULL==ptr)
それを使用します。コードを読むすべての人が同意する限り。
個人的には完全に定義された値(NULL == ptr)を使用しているので、何をチェックしているかは明らかです。タイプするのに時間がかかるかもしれませんが、私はそれを簡単に読むことができます。 !ptrを見逃しやすいと思います!すぐに読むなら。
それは本当にコンパイラに依存します。最近のほとんどのCコンパイラーが、あなたが説明する特定のシナリオに対して実質的に同一のコードを生成しなかったとしたら、私は驚きます。
コンパイラーを入手して、これらのシナリオごとにアセンブリー・リストを生成します。独自の質問に答えることができます(特定のコンパイラーについて:))。
そして、それらがare異なる場合でも、パフォーマンスの違いは実際のアプリケーションではおそらく無関係です。
コンパイラの最適化をオンにすると、基本的に同じです
これをgcc 4.3.3でテストしました
int main (int argc, char** argv) {
char c = getchar();
int x = (c == 'x');
if(x == NULL)
putchar('y');
return 0;
}
対
int main (int argc, char** argv) {
char c = getchar();
int x = (c == 'x');
if(!x)
putchar('y');
return 0;
}
gcc -O -o test1 test1.c
gcc -O -o test2 test2.c
diff test1 test2
出力がありません:)