2011-07-26 4 views
10

可能性の重複:私は私は思っていたC++コードの一部を通過するとC++ではNULL!= valueの意味は何ですか?

if (NULL != threadInfo) 
{ 
    ... 
    ... 
} 

のようなコードに出くわした
What is the difference between these (bCondition == NULL) and (NULL==bCondition)?

はどんな違いがあります式を使用する間

if (threadInfo != NULL) 
{ 
    ... 
    ... 
} 

上記の内容。 最初の読み込み中に "NULLがThreadInfoに等しくない場合"と読み込まれ、2番目に "threadInfoがNULLでない場合"と読み込まれます。私には2番目の方が理にかなっています。

+1

これを試したとき、どのような違いがありましたか? – marto

+4

c/C++で 'if(Constant == variable)'の多くを見ることができます。これは、2番目の値をオフのままにしておくとコンパイルエラーが発生するため、定数の左辺式に代入しようとします。多分何か似ている? – asawyer

+0

違いはありません。それは単なる式なので、変数と値の代わりに2つの値( 'if(true == true)')だけを見てください。 – Sander

答えて

14

いいえ、違いはありません。 ==の場合は多少の違いがあるかもしれません。問題は、誤って==の代わりに=と書くと、最初のケースでコンパイラがエラーを出すことです。

if (threadInfo = NULL) //always false. The compiler will give you a warning at best 

if (NULL = threadInfo) //Compiler error 

私は個人的に練習を嫌い、それは正常な人間の言語ではなく、ヨーダの言語で読むことができるコードを書く方が良いと思います。

+6

+1、確かに読みにくく、絶対に何の利益もありません。 '=='の代わりに '='をタイプし、それについて警告するために* nothing *を使用することが多い場合は、もっと大きな問題があるかもしれません。 – rid

+1

テンプレートコードが大量の偽陽性を生成するため、この警告は役に立ちません。 –

2

違いはありません。 NULL != ...の書き方のポイントは、代わりに入力ミスをしてNULL = ...と書くとコードがコンパイルされないということです。 ... = NULLがあった場合、それは有効な割り当てであり、エラーが気付かれなくなる可能性があります(しかし、ほとんどのコンパイラがこれを検出して警告します)。誰かが一度試みたinsert a backdoor into the Linux kernel using this technique

また、ほとんどの人はそういうコードを書いていないことにも注意してください。

0

これは通常、慣習として使用され、それ自体では明確な意味を持ちません。

割り当てがlvalsに発生し、NULLが割り当て不可能なため、またはthreadInfo != NULLというバグを意味するときは、これは恐ろしいthreadInfo = NULLに対して保護します。詳細については

this wikipedia article section on left-hand comparisons

2

差は最初のオプションとして誤って入力することができないことを除いて、ありませんを参照してください。

if (threadInfo = NULL) 
{ 
    ... 
    ... 
} 

そして、いくつかの人々がチェックするコンパイラスイッチを使用する方法がわかりませんのこれはコンパイラにはありません。

4

operator !=をオーバーライドする型のオーナーで、そのクラスの所有者が2つの引数がスワップされる場合を処理する対称フリー関数を提供していない場合、違いがある可能性がありますそのプログラマーを撃つ)。

それ以外の場合は、味わいの問題です。おそらく、if(answer == 42)の代わりにif(42 == answer)と書いた人が好むでしょう。これは、等価チェックではなく代入演算子を誤って入力するのを防ぎます。しかし、現代のコンパイラがそうするときに警告するので、このアプローチが何かを提供するかどうかは議論の余地があります。

+0

しかし、違いは、 'NULL!= threadInfo'はコンパイルされないということです。なぜなら、intにはthreadInfoタイプの演算子!=がないからです。 threadInfoがポインタ型の場合、違いがあるとは思いませんか? –

+0

@Douglas: 'threadInfo_TYPE'と同じ名前空間で定義されたフリー関数の' operator!=(int、threadInfo_TYPE) 'があるかもしれません。この場合、自動的にKoenig Lookupのために考慮されます。 – Jon

7

それは安全のためですので、あなたが誤って

threadInfo = NULL 

代わりのために

threadInfo == NULL 

で書いてはいけません!=そこにこれを行う必要ませんが、それは一貫です。

+5

ターン。コンパイラ。警告。に。 :| – GManNickG

+1

コンパイラの警告が表示されます。しかし、私は、他の人がそれをやっているので、それをやっているのではなく、何かの背後にある理由を知っています。私はちょうど理由を述べました - それは有効なものです - 私はあなたが警告を受けるべきではないと言っていませんでした... –

0

どちらも同じことをします。 、これは非常に規則をコーディングYoda

if (value=NULL) // assignment instead of == operator 
{ 
} 
1

差が呼び出されます。これは、としてタイプミスを避けるために使用されたスタイルの慣例です。

if (NULL != threadInfo) 

これらは、ロジックの点で正確な等価物である

if (threadInfo != NULL) 

と同等と

if (threadInfo) 
0

です。

2番目の方がより直感的です。最初の方が安全であると見なされる場合があります。誤って書き込みすることができないため、バグが発生します。(threadInfo = NULL)

0

ヌルはメモリ内の参照には何も含まれていませんが、アクセスするアドレスはありません。

これによって、あるオブジェクトに値があるかどうかを確認するためにnullの背後で比較することができます。

0

違いはありません。しかし、を書く練習では、NULL = someVarの書き込みを忘れると、第2の=の入力を忘れてしまいます。

関連する問題