4

質問で述べたように、私はNULLとfalse(C ++の場合)を0または0x0などと同じ意味で使用しています。それらが0の同義語以外の特別な意味を持っているかどうか知りたいと思いました。

4

6 に答える 6

7

一部のプラットフォーム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)


  1. C ++では、そのvoid *ような使用を面倒にするより厳密な暗黙のキャスト規則のためにキャストを存在できないことに注意してNULLください(毎回、比較されるポインターの型に明示的に変換する必要があります)。
于 2013-03-25T13:32:19.120 に答える
3

そうですね、NULLはゼロではないかもしれませんが、通常はゼロです。それはあなたのプラットフォームに依存します-ここにゼロ以外のNULLマシンのいくつかの厄介な例があります。

于 2013-03-25T13:32:30.833 に答える
1

通常、C++では使用しないでくださいNULL。ではCNULLはのマクロですが(void*)0、ではの代わりにをC++使用する必要があります。ただし、ポインタの代わりに使用することはできません。それを除けば、それらは実際には同じであり、時々混乱を引き起こします。 これが、inがポインタの使用として定義された理由です。0NULLfalse0
C++11nullptr

于 2013-03-25T13:32:43.253 に答える
1

NULLはポインタで広い意味を持っています。おそらく、NULLとして宣言されたポインタは、参照することはできませんが、何かを割り当てることができるものです。一方、0または0x0は、参照と割り当ての両方が可能なポインターの値にすることができます。

于 2013-03-25T13:34:22.147 に答える
0

Linuxカーネルstddef.hから

#define NULL ((void *)0)

enum {
        false   = 0,
        true    = 1
};

だからそれは正確ではありませんfalse

この投稿はそれがNULLである0x0と主張していますが、falseほとんど同じです。

于 2013-03-25T13:35:34.013 に答える
0

Cおよび歴史的なC++では、NULLはゼロ値の整数定数である必要があります。通常は0。Cには明示的なキャストを含めることができると思いますが、C ++では、その言語では他のポインター型void*からの暗黙的な変換が許可されていないため、含めることができません。void*

最新のC++では、代わりにどちらかを使用できますnullptr

いずれの場合も、ゼロ値の整数定数('\0'やなどの奇数を含むfalse)は、nullポインター値に変換できます。

于 2013-03-25T13:39:59.493 に答える