8

Stroustrup による C++ プログラミング言語第 3 版には、次のように書かれています。

ポインターの減算は、両方のポインターが同じ配列の要素を指している場合にのみ定義されます (言語には、そうであることを確認する高速な方法はありませんが)。あるポインターを別のポインターから減算すると、結果は 2 つのポインター間の配列要素の数 (整数) になります。ポインターに整数を加算したり、ポインターから整数を減算したりできます。どちらの場合も、結果はポインター値です。 その値が元のポインターと同じ配列の要素またはそれを超える要素を指していない場合、その値を使用した結果は未定義です。

例えば:

void f ()
{
    int v1 [10];
    int v2 [10];
    int i1 = &v1[5] - &v1[3];   // i1 = 2
    int i2 = &v1[5] - &v2[3];   // result undefined
}

ウィキペディアで不特定の動作について読んでいました。それは言う

C および C++ では、オブジェクトへのポインターの比較は、ポインターが同じオブジェクトのメンバーまたは同じ配列の要素を指している場合にのみ厳密に定義されます。

例:

int main(void)
{
  int a = 0;
  int b = 0;
  return &a < &b; /* unspecified behavior in C++, undefined in C */
}

だから、私は混乱しています。どちらが正しいですか?ウィキペディアかストロストロップの本か?これについて C++ 標準は何と言っていますか?

何か誤解している場合は訂正してください。

4

1 に答える 1