NULL
単に書いていないことへのポインタを確認しても安全ですか、それともif(pointer)
使用する必要がありますif(pointer != NULL)
か?
NULL
ため、NULL
あいまいな動作が発生する可能性があるため、今後はC ++で使用しないでください。
NULL
単に書いていないことへのポインタを確認しても安全ですか、それともif(pointer)
使用する必要がありますif(pointer != NULL)
か?
NULL
ため、NULL
あいまいな動作が発生する可能性があるため、今後はC ++で使用しないでください。
回答:
あなたはできる; nullポインターは暗黙的にブールfalseに変換されますが、null以外のポインターはtrueに変換されます。C ++ 11標準のブール変換に関するセクション:
算術、スコープのない列挙、ポインター、またはメンバー型へのポインターのprvalueは、typeのprvalueに変換できます
bool
。ゼロ値、nullポインター値、またはnullメンバーポインター値はに変換されfalse
ます。その他の値はすべてに変換されtrue
ます。タイプのprvalueは、タイプのprvalueにstd::nullptr_t
変換できますbool
。結果の値はfalse
です。
はい、できます。
これは、ブール変換句に含まれるC ++標準変換の一部です。
§4.12ブール変換
算術、スコープなし列挙、ポインター、またはメンバー型へのポインターのprvalueは、bool型のprvalueに変換できます。ゼロ値、nullポインター値、またはnullメンバーポインター値はfalseに変換されます。その他の値はすべてtrueに変換されます。std :: nullptr_t型のprvalueは、bool型のprvalueに変換できます。結果の値はfalseです。
はい、できます。実際、if(pointer)
慣れると読み書きが簡単になるので、使用することを好みます。
また、C ++ 11が導入されnullptr
たことに注意してくださいNULL
。
if(som_integer)
vsに適用できますif(some_integer != 0)
よね?私は避けるために好む0
か、NULL
if文で。
if (pointer)
自分を好むif (ptr != nullptr)
ようになりましたが、私には完全に合法のようです。一方、書いたチームの誰かを見かけif (some_integer)
たら、に変更させif (some_integer != 0)
ます。ただし、これは自分の側で比較的恣意的な好みではないというふりはしません。ポインタと整数を同じように扱わないほうがよいだけです。
if(isReady)
if(filePtr)
if(serviceNo)
ですか?意図的に不適切な変数名を作成しても、この場合はそれほど意味がありません。とにかく、私はすでにあなたの要点を理解し、それを理解しましたが、私自身のコーディングスタイルを自分で使用するように主張できます。
質問に回答しましたが、ポイントを追加したいと思います。
私はいつも好むでしょうif(pointer)
代わりに、if(pointer != NULL)
とif(!pointer)
の代わりにif(pointer == NULL)
:
少ないチャンスは、私は平等のチェック演算子をスペルミス場合と仮定し、バグだらけのコードを記述すること==
で=
if(pointer == NULL)
スペルミスすることができif(pointer = NULL)
、私はそれを避けることができますので、最高のはただですif(pointer)
。
(私はまた、いくつかのヨーダ条件を1つの回答で提案しましたが、それは別の問題です)
同様にwhile (node != NULL && node->data == key)
、私は単純にwhile (node && node->data == key)
それを私にもっとわかりやすく書くでしょう(短絡を使用していることを示しています)。
(boolean expression)? true : false
完全に無意味です。式はto true
またはtoのいずれかを評価しfalse
ます。あなたが言うことは「それが本当なら、私に本当を与え、それが偽りなら、私に偽りを与えなさい」です。つまり、ブール式自体と完全に同等です。注node == NULL
ブール式です。ところで、あなたの2つの実装は互いに正反対を返します。どちらのあなたが欲しい!=
最初に、または唯一の!
第二インチ
=
代わりに可能な対策の1つは、可能な限り==
変数を作成するconst
ことです。たとえば、関数をとして定義するisEmnpy(node* const head) { ... }
と、誤ってのnode = NULL
代わりに書き込んだ場合、コンパイラはその関数のコンパイルを拒否しますnode == NULL
。もちろん、これは実際に変更する必要がない変数に対してのみ機能します。
T* get() const
代わりに持っているoperator T*() const
からです。しかし、彼らは持っていoperator bool() const
ます。
はい、できます。値をゼロと暗黙的に比較する機能はCから継承されており、C ++のすべてのバージョンにあります。を使用if (!pointer)
してポインタのNULLをチェックすることもできます。
nullポインターの関連する使用例は次のとおりです。
動的キャスト。ベースクラスポインターを特定の派生クラスへのキャスト(もう一度回避する必要がありますが、必要な場合もあります)は常に成功しますが、派生クラスが一致しない場合はnullポインターになります。これを確認する1つの方法は
Derived* derived_ptr = dynamic_cast<Derived*>(base_ptr);
if(derived_ptr != nullptr) { ... }
(または、できれば、auto derived_ptr = ...
)。安全保護if
ブロックのスコープの外に(おそらく無効、つまりnull)派生ポインターが残るため、これは悪いことです。C ++では-condition 内にif
ブール変換可能な変数を導入できるため、これは必要ありません。
if(auto derived_ptr = dynamic_cast<Derived*>(base_ptr)) { ... }
これは、短くてスコープセーフであるだけでなく、その意図もはるかに明確です。別のif条件でnullを確認すると、読者は「わかりましderived_ptr
た。ここではnullにしないでください...」ヌル?」1行のバージョンは非常にはっきり言うのに対し、「あなたが安全にキャストすることができる場合base_ptr
にDerived*
、そのためにそれを使用して...」。
IMOは一般的にこれを回避する必要がありますが、ポインターを返す他の考えられる失敗した操作でも同じようにboost::optional
機能します。ポインターではなく、操作が失敗する可能性がある場合は、「コンテナー」のようなものを使用することをお勧めします。
したがって、nullポインターの主な使用例を暗黙のキャストスタイルのバリエーションで常に記述する必要がある場合、一貫性の理由から常にこのスタイルを使用することをお勧めif(ptr)
しif(ptr!=nullptr)
ます。つまり、overを推奨します。
私は広告で終わらなければならないのではないかと思いif(auto bla = ...)
ます。構文は、実際には、そのような問題の実際の解決策であるパターンマッチングのほんの少し面倒な近似です。なぜ最初に何らかのアクション(ポインタのキャストなど)を強制してから、失敗の可能性があると見なすのでしょうか。つまり、それはばかげていますね。食べ物があり、スープを作りたいのです。果汁がやわらかい野菜の場合は、ジュースを抽出するタスクでアシスタントに渡します。あなたは最初にそれを見ません。ジャガイモを手に入れても、それをアシスタントに渡しますが、失敗のメモを付けて平手打ちします。ああ、命令型プログラミング!
はるかに良い:発生する可能性のあるすべてのケースをすぐに検討してください。その後、それに応じて行動します。Haskell:
makeSoupOf :: Foodstuff -> Liquid
makeSoupOf p@(Potato{..}) = mash (boil p) <> water
makeSoupOf vegetable
| isSoft vegetable = squeeze vegetable <> salt
makeSoupOf stuff = boil (throwIn (water<>salt) stuff)
Haskellには、本当に深刻な失敗の可能性がある場合(および他の多くのもの)のための特別なツールもあります。モナドです。しかし、これはそれらを説明する場所ではありません。
⟨/広告⟩
if(ptr)
なく実際に使用する必要がある理由を適切に説明しようif(ptr != nullptr)
としました。
他の人はすでによく答えたので、どちらも交換可能です。
それでも、明示的なステートメントを使用したい場合があるかもしれないことを言及する価値があります、すなわちpointer != NULL
。
はい、 'IF'条件は内部の条件がtrueになった場合にのみ評価されるため、いつでもこれを実行できます。Cはブール型の戻り値を持たないため、条件がtrueの場合はゼロ以外の値を返し、 'IF'の条件がfalseの場合は常に0を返します。デフォルトで返されるゼロ以外の値は1です。したがって、コードを作成する両方の方法が正しい一方で、常に2番目の方法を優先します。
「それは安全ですか?。」言語標準と生成されたコードに関する質問です。
「いい練習ですか?」発言を任意の人間の読者がどの程度理解しているかについての質問です。この質問をしている場合は、「安全な」バージョンは将来の読者やライターにとって不明確であることが示唆されています。
0
またはに対してテストすることは同じくらい効果的であり、しばしば好まれnullptr
ます。(NULL
C'ismであり、ヘッダーファイルを含める必要があります。)