2

C99セクション6.5.6のパラグラフ8と9を理解しようとしています(加算演算子)

パラ8は次のことを意味しますか?

int a [4];

int *p = a;
p --;      /* undefined behaviour */

p = a + 4; /* okay */
p --;      /* okay */
p += 2;    /* undefined behaviour */

p = a;
p += 5 - 5;    /* okay */
p = p + 5 - 5; /* undefined behaviour */

段落9については、ptrdiff_tは常に2つのポインターの差を保持するのに十分な大きさであると理解していました。しかし、「値がptrdiff_t型のオブジェクトに適合する場合」という表現は、この理解が間違っていることを示唆しているようです。私の理解が間違っているのか、それともC99が何か別の意味を持っているのか。

ドラフト標準へのリンクはここにあります:http: //cboard.cprogramming.com/c-programming/84349-c-draft-standards.html

4

2 に答える 2

2

あなたの解釈は正しくないと思います。私が持っているバージョン(n1256)のパラグラフ9は次のように述べています。

結果がそのタイプのオブジェクトで表現できない場合、動作は定義されていません

それだ。差がより大きいPRTDIFF_MAXか小さい場合PTRDIFF_MIN、動作は定義されていません。

これは、違いがに収まるかどうかをチェックするためにプログラマーに負担をかけることに注意してくださいptrdiff_t。「怠惰な」プラットフォームの実装では、狭いタイプを選択するだけで、ptrdiff_tそれに対処することができます。

UBを誘発せずに減算を行うことはできないため、それをチェックするのは簡単ではありません。2つのポインタが同じオブジェクトの内側(またはそのすぐ外側)を指し、その周囲のオブジェクトの境界がどこにあるかという情報を使用する必要があります。

于 2011-11-25T22:30:25.690 に答える
0

私はあなたのパラグラフ8の理解に同意します。

ポインタオペランドと結果の両方が同じ配列オブジェクトの要素を指している場合、または配列オブジェクトの最後の要素を1つ過ぎている場合、評価によってオーバーフローが発生することはありません。それ以外の場合、動作は定義されていません。

Cは、配列内にポインターオーバーフローがないと想定しているようです。そのため、配列内にいる間はポインターをインクリメント/デクリメントできます。結果ポインタが配列を離れる場合、オーバーフローが発生する可能性があり、動作は未定義です。

パラグラフ9に関しては、標準では、たとえば32ビットポインタと32ビットデータタイプを提供するアーキテクチャがある可能性があることを考慮していると思いますが、実際には2つの32ビットポインタの違いは符号と32ビットです(つまり33ビット)、すべてのポインタの違いが32ビットのptrdiff_tに一致するわけではありません。2の補数アーキテクチャでは、これは問題ではありませんが、他のアーキテクチャでは問題になる可能性があります。

于 2011-11-25T12:14:05.720 に答える