2016-04-09 9 views
2

は、次のコードを考えてみましょう。`(T *)0 - (T *)0`はよく定義されていますか?予想通り<a href="http://ideone.com/7addql" rel="nofollow">ideone</a>で</p> <pre><code>#include <iostream> int main() { int *a = 0, *b = 0; std::cout << (a - b); } </code></pre> <p>このコードを印刷0、私はそれが明確に定義された行動かどうかわからない:

(T*)0 - (T*)0が明確に定義されているのでしょうか? 0と等しいことが保証されていますか?
CとC++で同じですか?そうでない場合、違いは何ですか? C++で

(ポインタ演算は、彼らのために動作しないので、もちろん、Tは、voidstd::nullptr_tではありません。)

+0

古い質問は、古いバージョンのCおよびC++に明示的に限定されています。この質問は、より現代的なバージョンの回答を集めていたので、私は再開することにしました。 –

+2

@AdrianMcCarthyわかりません。それは一般的なC++/cタグに加えて古いバージョンでタグ付けされていましたが、一番上の投票回答は、C++ 03とC++ 11バージョンのこの質問に対する唯一の答えと同じソースのように見えます – Foon

答えて

6

[expr.add]/7参照:二つのポインタ場合

を[...]の両方がnullであります2つのポインタが を差し引いた場合、結果は0と の型std::ptrdiff_tに変換された値と等しいと比較されます。

(これはまた、この段落を短くれ、P0137で保持する。)

をC11において、挙動は6.5.6/9の通り明らかに定義されていません:

二つのポインタが減算される場合は、両方とも同じ配列オブジェクトの の要素を指すか、または配列オブジェクトの最後の要素を先に指すポインタです。 結果は2つの配列 要素の添字の違いになります。

+1

open-std.orgにはサーバーの問題があるように見えるため、Googleキャッシュサイトにリンクしています。 – Columbo

関連する問題

 関連する問題