Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
k-satoda opened this issue Dec 14, 2018 · 0 comments

Comments

@k-satoda
Copy link

( close となった issue の reopen はできなかったので、つづきを別 issue としています。)
#3 (comment) より:

...昔の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

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

  • c250d15#diff-d27600081f0d6802e8fd7ede213346bfR230

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

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

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

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

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant