節§6.5.3.2言う¶3「アドレスと間接演算子」(関連セクションのみ):C標準
単項&オペレータがそのオペランドのアドレスを返します。 ... オペランドが単精度
*
演算子の結果である場合、その演算子も&
演算子も評価されず、演算子の制約が適用され、結果が左辺値。同様に、オペランドが[]
演算子の結果である場合、[]
によって暗示される&
オペレータも単項*
どちらが評価され、&
オペレータを除去し、[]
オペレータが+
オペレータに変更した場合と同様の結果であります。 ...
これは、このことを意味します
#define NUM 10
int tmp[NUM];
int *i = tmp;
printf("%ti\n", (ptrdiff_t) (&*i - i));
printf("%ti\n", (ptrdiff_t) (&i[NUM] - i));
が0とNUM
(10)を印刷、完全に合法であるべき。標準は、これらのケースの両方を最適化する必要があることは非常に明白です。
しかし、最適化されるように次のことを要求していないようだ。
struct { int a; short b; } tmp, *s = tmp;
printf("%ti\n", (ptrdiff_t) (&s->b - s));
これはひどく矛盾しそうです。私は上記のコードがsizeof(int)
に加えて(おそらく)パディング(おそらくは4)を印刷してはならないという理由は見当たりません。
簡略化&->
式は、単純なアドレス+オフセットである&[]
と概念的に(IMHO)同じになります。 []
演算子で実行される可能性があるのではなく、コンパイル時に確定できるオフセットですらあります。
なぜこのように一見矛盾しているのかという根拠には何かがありますか?
ハードコアとC++の標準的な質問を見たことがありますが、私は何かをやっているだけで何もしていない、好きな人は答えを読むのを待っています。実際に書いたのは変だと感じます。 –
興味深い... MSVC++は4枚印刷します! – Abhi
@Abhi Rao - -Wall -Wextra -Werrorを持つGCC(4.0)は、苦情なしでコンパイルして4を出力します。 –