2017-04-25 1 views
0

私は変数に値を代入するコードスニペットを持っています、var。その間に、変数は左/右シフト演算に作用する。そのような変数はいつまでもnullになる可能性があります。c/C++で左または右シフト操作によって変数がnullになることはありますか?

if (var == null) 

になることはありませんデッドコードに上昇を与える:nullがほとんどそれはNULLにすることはできません場合は、のようなチェックが

#define null ((void*)0)

として定義されていることを

注意実行される。

+1

"nullはほとんどが"と定義されていると定義されていますか? – AnT

+0

私は、ほとんどのC++コンパイラでNULLが0と定義されていると主張します。明らかに 'null'は標準定義ではないので、何にでも定義できます。完全なコードがなければ、言うことは難しいですが、値がゼロになると、警告が出ていても、それは 'NULL'または' NULL'の定義と一致すると主張します。 –

答えて

2

組み込みのシフト演算子は、の列挙型またはunscoped列挙型型の値にのみ適用されます。 nullとの組み込み比較は、のポインタタイプの値に対してのみ有効です。つまり、組込みシフトの結果をあなたのnullと比較することはできません。 (ここでの唯一の抜け穴は、シフトを使用してヌルポインタ定数を形成する可能性です(これは整数ゼロですが、これはC++ 11以前の言語でのみ可能です)。

つまり、この質問が発生する可能性のある有効なコンテキストはありません。 ifは「デッドコード」または「生きたコード」を生成しません。それはまったくコンパイルされません。

しかし、オーバーロードされた演算子については、すべてが可能です。しかし、その場合、あなたの質問は意味をなさず広すぎます。

+0

varに割り当てられた値はポインタであり、シフトやビットワイズのようにその論理演算が行われます。それは可能ですか? – user3552519

+0

@ user3552519:いいえ、C++のポインタに対して「シフトとビットワイズ」操作を行うことはできません。 C++でのシフト演算とビット演算は、整数型と列挙型にのみ適用されます。 – AnT

+0

ポインタアドレスを型キャストしてその上で論理演算を行うことはできませんか? – user3552519

1

Cでは、intergerの値をポインタと比較できるので、コードは警告を生成しますが、期待どおりに動作するようになります。 (しかし、間違いなく推奨されていません)

+0

整数のゼロ定数を除いて、整数値をCのポインタと正当に比較することはできません。C言語にはそのような機能はありません。 – AnT

+0

@AnT私たちは皆知っているように、C言語で定義されているものと、Cコンパイラが実際にソースコードとして受け入れるものとの間には相違があります。 –

+0

「受け入れる」という意味に依存します。 Cコンパイラは、不正なコードに応答して診断メッセージを発行する必要があります。そして、彼らはそうする。その後、すべての賭けはオフになります。それは "受け入れる"か "拒絶する"か? – AnT

関連する問題