質問で述べたように、私はNULLとfalse(C ++の場合)を0または0x0などと同じ意味で使用しています。それらが0の同義語以外の特別な意味を持っているかどうか知りたいと思いました。
6 に答える
一部のプラットフォームNULL
ではそうではありません0x0
From CのNULLはゼロである必要がある/定義されていますか?:
NULL
ゼロであることが保証されており、おそらく(void *)
1にキャストされます。
C99、§6.3.2.3、¶3
値を持つ整数定数式
0
、またはタイプにキャストされたそのような式void *
は、nullポインター定数と呼ばれます。(55)nullポインター定数がポインター型に変換される場合、結果のポインターはnullポインターと呼ばれます。任意のオブジェクトまたは関数へのポインタと等しくないものと比較してください。
そして注55は言う:
55)マクロNULLは、
<stddef.h>
(および他のヘッダーで)nullポインター定数として定義されています。
nullポインターのルールがどのように定式化されているかにより、nullポインターの割り当て/比較に使用する値はゼロであることが保証されますが、ポインター内に実際に格納されるビットパターンは他のものである可能性があります(ただし、AFAIKはごくわずかです)。難解なプラットフォームはこの事実を利用しましたが、基礎となるビットパターンを「見る」には、とにかくUBランドに入る必要があるため、これはとにかく問題にはなりません。
したがって、標準に関する限り、2つの形式は同等です(!ptr
§6.5.3.3¶5ptr==0
によるものと同等であり、)ptr==0
と同等ptr==NULL
です。if(!ptr)
また、かなり慣用的です。
そうは言っても、私は通常、ブール値ではなくnullがないかポインターをチェックしていることを明確にするif(ptr==NULL)
のではなく、明示的に記述します。if(!ptr)
- C ++では、その
void *
ような使用を面倒にするより厳密な暗黙のキャスト規則のためにキャストを存在できないことに注意してNULL
ください(毎回、比較されるポインターの型に明示的に変換する必要があります)。
そうですね、NULLはゼロではないかもしれませんが、通常はゼロです。それはあなたのプラットフォームに依存します-ここにゼロ以外のNULLマシンのいくつかの厄介な例があります。
通常、C++
では使用しないでくださいNULL
。ではC
、NULL
はのマクロですが(void*)0
、ではの代わりにをC++
使用する必要があります。ただし、ポインタの代わりに使用することはできません。それを除けば、それらは実際には同じであり、時々混乱を引き起こします。
これが、inがポインタの使用として定義された理由です。0
NULL
false
0
C++11
nullptr
NULLはポインタで広い意味を持っています。おそらく、NULLとして宣言されたポインタは、参照することはできませんが、何かを割り当てることができるものです。一方、0または0x0は、参照と割り当ての両方が可能なポインターの値にすることができます。
Linuxカーネルstddef.hから
#define NULL ((void *)0)
enum {
false = 0,
true = 1
};
だからそれは正確ではありませんfalse
この投稿はそれがNULL
である0x0
と主張していますが、false
ほとんど同じです。
Cおよび歴史的なC++では、NULL
はゼロ値の整数定数である必要があります。通常は0
。Cには明示的なキャストを含めることができると思いますが、C ++では、その言語では他のポインター型void*
からの暗黙的な変換が許可されていないため、含めることができません。void*
最新のC++では、代わりにどちらかを使用できますnullptr
。
いずれの場合も、ゼロ値の整数定数('\0'
やなどの奇数を含むfalse
)は、nullポインター値に変換できます。