var_ptr==NULL
との違いは何NULL==var_ptr
ですか? さまざまなアーチで動作の変更はありますか?
5 に答える
これらはYoda 条件であり、この場合、特定のコーディング スタイルを選択する以外にそれらを使用する理由はありません。
=
ウィキの記事に書いてある通り、等号演算子の代わりに代入演算子を使うと、不要な代入がエラーとして報告されるのが利点と考えられます==
。
if (ptr = NULL) // valid code, may produce a warning on some compilers
if (NULL = ptr) // invalid, reported as error during compile time
私の意見では、後者の可読性ははるかに悪いです。
次のように(Java または C# で)一種のYoda 条件を使用すると、利点があります。
"constant string".equals(yourVariableString)
NullPointerException を取得する可能性がないため
コンパイラー内では、ポインター値をゼロの定数値と比較する命令が引き続き取得されます。この命令は、ほとんどのプロセッサでは、単一の形式でのみ存在します(ただし、AND R0, R0
同じことを実現する方法が複数ある場合もあります。 「0 でない場合はジャンプ」) - プロセッサのアーキテクチャによっては、別のバリアントよりも 1 つを実行する方が高速な場合がありますが、最終的には、定数 0 を使用した単一の比較になります。コンパイラは、これらのバリアントのいずれかを、使用することを選択した「この変数は NULL です」のバリアントに関係なく、同じものに最適化できる必要があります。CMP $0, R0
MOV var_ptr, R0
if (!var_ptr)
もちろん、同じ結果を達成するためのより複雑な方法がいくつかあります。そのような考え方を持つ人は、コンパイラが混乱させるような複雑なものを考え出すことができると確信しています)。
違いはありません。これは、意図しない割り当てを防ぐ方法にすぎません。例えば:
if (var = true); // I meant to compare, but this will still compile
とは対照的に:
if (true = var); // I meant to compare, but this WON'T compile
一部の人々は、
NULL == var_ptr
偶発的な「割り当て」のタイプミスから保護するためのオプション。
if (NULL = var_ptr) { ... }
定数に割り当てているため、構文エラーが発生します。逆に、
if (var_ptr = NULL) { ... }
構文的には正しいですが、意図したものではないことはほぼ確実です。
違いがあるかどうかを確認するために、VS 2012 で小さなスニペットをコンパイルしました。最適化なしのデバッグ モードです。
int * p = NULL;
if (p == NULL) p = NULL;
if (NULL == p) p = NULL;
x86
if (p == NULL) -(disassembly)-> cmp dword ptr [p],0
if (NULL == p) -(disassembly)-> cmp dword ptr [p],0
x64
if (p == NULL) -(disassembly)-> cmp qword ptr [p],0
if (NULL == p) -(disassembly)-> cmp qword ptr [p],0
コンパイラは、持っているかどうかに関係なく、同じコードを生成しNULL
ますp
。したがって、それは単にスタイルの問題であり、左辺に非左辺値を持つ理由についての質問ですか? はすでにリンクされています。また、Yoda-Condition を直接参照している wiki 投稿も、左側に左辺値を持たないことが望ましい理由を示しています。