cpp-intro icon indicating copy to clipboard operation
cpp-intro copied to clipboard

意味上のポインター: #3 "不適切と思われる説明2点" のつづき

Open k-satoda opened this issue 6 years ago • 0 comments

( close となった issue の reopen はできなかったので、つづきを別 issue としています。) https://github.com/EzoeRyou/cpp-intro/issues/3#issuecomment-447260485 より:

...昔のC言語では0はnullポインターの値だと規格上定められてはいなかった。

「規格」としておそらく最古の C89 時点でも 0 はヌルポインタ定数とされています。 http://port70.net/~nsz/c/c89/c89-draft.html#3.2.2.3

An integral constant expression with the value 0, or such an expression cast to type void * , is called a null pointer constant. ...

同様の規定が C99, C11 のドラフトでも確認できます。 http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf

ということで以下の点を改めて見直しおねがいします。

  • https://github.com/EzoeRyou/cpp-intro/commit/c250d153bd2eb58aa7598f00875a9b8517fcbcaf#diff-d27600081f0d6802e8fd7ede213346bfR230

    C++ではさらに歴史的な理由で、0もnullポインター値として扱う。

    ポインタの文脈で 0 をnullポインター値として扱う(ヌルポインタ定数と する)のはC言語も同じなので、「C++では」として直前の NULL の紹介と 分けられているのは不適切だと思います。

修正 50afb5a33081f0b2d1cf670d70f0293f7dd05b95 後の文面について。

...わからない値を持ったポインターの参照先への読み書きは未定義の挙動を引き起こす。

実際は参照先への読み書き以前に(直前の int の例と同様に)未初期化変数の 値を読んだ時点で未定義動作となります。参照先の読み書きを行わない std::cout << pointer でも未定義動作ということです。 後続の「なぜ未定義の挙動になるかというと~」も含めて、この記述だと 「読み書きさえしなければ未定義動作とならない」と読まれる可能性があり、 適切ではないと思います。

k-satoda avatar Dec 14 '18 15:12 k-satoda