20

これは、この質問の拡張と考えることができます(私は C のみに興味がありますが、拡張を完了するために C++ を追加します)。

6.3.2.3.3 の C11 標準には、次のように記載されています。

値が 0 の整数定数式、または type にキャストされたそのような式void *は、NULL ポインター定数と呼ばれます。

これに対する私の個人的な見解は、整数値が実際には 0 ではない可能性がある null ポインター0(void *)0表しているということですが、それは他の型への 0 キャストをカバーしていません。

ただし、標準は次のように続きます。

ヌル ポインター定数がポインター型に変換される場合、結果のポインターはヌル ポインターと呼ばれます。

キャストは変換メソッドの下にリストされている明示的な変換(C11、6.3) である(int *)0ため、null ポインターとしてカバーされます。

しかし、それでも私が不思議に思うのは、次のフレーズです

... または型にキャストされたそのような式void *...

上記のセマンティクスでは、この句はまったく役に立たないように見えます。問題は、このフレーズはまったく役に立たないということですか? そうでない場合、それにはどのような意味がありますか?その結果、(int *)0ヌルポインタかどうか?


議論に役立つ別の質問は次のとおりです。(long long)123「123 に変換long long」、または「123 型付き」と見なされlong longます。つまり、変換はあり(long long)123ますか? 何もない場合、上記の 2 番目の引用は null ポインターとしてカバーされません。(int *)0

4

2 に答える 2