トップ回答者
「0」、「NULL」について

質問
回答
-
人間がヌルポインタであることがわかりやすいようにする目的でNULLを使用する。ただし内部的には0であり時には数値として解釈されてしまうことを忘れてはいけない。
昔、Effective C++ を読んで「なるほどな」と思った例を蛇足で。
void f(int) { cout << "f(int) called" << endl; } void f(void*) { cout << "f(void*) called" << endl; }
こんな感じの2つの関数があると f(NULL) は int の方が呼ばれます。時には数値として解釈されてしまうという好例かと。
近い将来、何も考えずに「そういう時は nullptr を使え」で済むようになるんでしょうね。NULL の代わりに 0 を使っていると後から全部 nullptr に置換したくなった時に大変だと思うので、nullptr が使えない環境では 0 を使うよりも気をつけながら NULL を使う方がベターな気がします。(少なくとも私はそう思って NULL を使うようにしています。)
- 回答としてマーク Kiirokuma 2011年5月20日 1:00
すべての返信
-
書かれていませんがヌルポインタとして 0 / NULL どちらが適切かという質問でしょうか? 数値のzeroとしては 0 を使用すべきです。
0 / NULL の議論はいろいろ難しいものがありますが、
人間がヌルポインタであることがわかりやすいようにする目的でNULLを使用する。ただし内部的には0であり時には数値として解釈されてしまうことを忘れてはいけない。
と考えています。そして近頃、新たな展開があります。VC++ 2010からnullptrキーワードが用意されました。(正確にはVC++ 2008にもC++/CLI向けには存在します。)
nullptrキーワードが使える環境ではこれを使うのが一番いいです。 -
>C++ではNULLではなく0を使用した方がいい
様々な理由があるとは思いますが、ご自身で「これは理に適っているから、0を使用した方が良いのではないか」と思った理由は何でしょうか。Softwareの開発分野で使い分ければよいとは思いますが、
Windows Applicationの開発では、Windows APIのReferenceにNULL表記が使われているので、私はそれに合わせてNULLを使っています。以前似たような質問があったので紹介しておきますね。
[nullptrとNULL]
http://social.msdn.microsoft.com/Forums/ja-JP/vcgeneralja/thread/3171a074-5ae2-4bbe-88a0-fdef3f972536/ -
人間がヌルポインタであることがわかりやすいようにする目的でNULLを使用する。ただし内部的には0であり時には数値として解釈されてしまうことを忘れてはいけない。
昔、Effective C++ を読んで「なるほどな」と思った例を蛇足で。
void f(int) { cout << "f(int) called" << endl; } void f(void*) { cout << "f(void*) called" << endl; }
こんな感じの2つの関数があると f(NULL) は int の方が呼ばれます。時には数値として解釈されてしまうという好例かと。
近い将来、何も考えずに「そういう時は nullptr を使え」で済むようになるんでしょうね。NULL の代わりに 0 を使っていると後から全部 nullptr に置換したくなった時に大変だと思うので、nullptr が使えない環境では 0 を使うよりも気をつけながら NULL を使う方がベターな気がします。(少なくとも私はそう思って NULL を使うようにしています。)
- 回答としてマーク Kiirokuma 2011年5月20日 1:00
-
Visual C++では次のようにNULLが定義されています。
/* Define NULL pointer value */
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endifこれの意味するところはまさしくzakioさんが挙げられたように、C++におけるオーバーロード解決ではintが選ばれる必要があるからで、Cの時とC++の時とで定義内容を区別しているわけです。
ちなみにプログラミング言語C++ 第3版には
const int NULL = 0;
とありました。