web-dev-qa-db-ja.com

C:NULLとの比較

宗教的な議論はさておき:

  • オプション1:

    if (pointer[i] == NULL) ...
    
  • オプション2:

    if (!pointer[i]) ...  
    

Cでは、option1は機能的にoption2と同等ですか?

比較がないため、後者の方が早く解決しますか?

23
Ande TURNER

私は2番目が好きで、他の人は1番目が好きです。

実際、私は最初のものよりも3番目の種類を好む:

_if (NULL == ptr) {
   ...
}
_

それで私は:

  • 見逃すことはなく、「=」を1つ入力するだけです
  • "== NULL"を見逃さず、条件が長い場合(複数行)

機能的には同等です。

NULLポインターが "0"(すべてゼロのビット)でない場合でも、if (!ptr)NULLポインターと比較されます。

以下は正しくありません。参照しているコメントが多いため、ここにあります:ただし、ポインタをリテラル0と比較しないでください。ほとんどどこでも動作しますが、動作は未定義ですIIRC。

18
Thomas

私は明示的なスタイル(最初のバージョン)を好みます。これは、整数やその他のポインタではなく、関連するポインタがあることを明らかにしますが、それは単にスタイルの問題です。

パフォーマンスの観点からは、違いはありません。

33
Laserallan

同等。それは言語標準でそう言っています。そして人々は最も難しい宗教的な好みを持っています!

31
Norman Ramsey

多くの場合、コンパイラの作成者は少なくとも最小限の知能を持っていると想定すると役立ちます。あなたのコンパイラはnot混乱したアヒルの子によって書かれています。何年にもわたるプログラミングの経験と、コンパイラー理論の研究に長年費やした人間によって書かれています。これは、コンパイラが完全であり、常に最良の知識を持っているという意味ではありませんが、doesは、簡単な自動最適化を完全に処理できることを意味します。

2つの形式が同等である場合、コンパイラがどちらか一方を同等に効率的にするために、なぜ一方をもう一方に変換しないのでしょうか。

if (pointer[i] == NULL)if (!pointer[i])よりも遅い場合、コンパイラはそれを2番目のより効率的な形式に変更しませんか?

つまり、同等であると仮定すると、同等に効率的です。

質問の最初の部分については、はい、それらは同等です。言語標準は実際にどこかでこれを明示的に述べています-ポインターは、それがNULLでない場合はtrueに評価され、NULLの場合はfalseに評価されるため、2つはまったく同じです。

19
jalf

ほぼ間違いなくパフォーマンスに違いはありません。しかし、私は秒の暗黙のスタイルを好みます。

9
Barry Kelly

NULLは、次のように標準ヘッダーファイルの1つで宣言する必要があります。

#define NULL ((void*)0)

したがって、どちらの方法でも、ゼロと比較していて、コンパイラーは両方を同じ方法で最適化する必要があります。すべてのプロセッサには、ゼロと比較するための「最適化」またはオペコードがあります。

3
Mark Rushakoff

初期の最適化は悪いです。マイクロ最適化も悪いです。CPUからHzの最後のすべてのビットを絞り込もうとしない限り、それを行っても意味がありません。人々がすでに示したように、コンパイラはとにかくほとんどのコードを最適化します。

コードをできるだけ簡潔で読みやすくするのが最善です。これがより読みやすい場合

if (!ptr)

これより

if (NULL==ptr)

それを使用します。コードを読むすべての人が同意する限り。

個人的には完全に定義された値(NULL == ptr)を使用しているので、何をチェックしているかは明らかです。タイプするのに時間がかかるかもしれませんが、私はそれを簡単に読むことができます。 !ptrを見逃しやすいと思います!すぐに読むなら。

1
shimpossible

それは本当にコンパイラに依存します。最近のほとんどのCコンパイラーが、あなたが説明する特定のシナリオに対して実質的に同一のコードを生成しなかったとしたら、私は驚きます。

コンパイラーを入手して、これらのシナリオごとにアセンブリー・リストを生成します。独自の質問に答えることができます(特定のコンパイラーについて:))。

そして、それらがare異なる場合でも、パフォーマンスの違いは実際のアプリケーションではおそらく無関係です。

0
Thomas Lee

コンパイラの最適化をオンにすると、基本的に同じです

これを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

出力がありません:)

0
Charles Ma