Является ли сравнение указателей неопределенным или неопределенным поведением в C ++?

В третьем издании языка программирования C ++, написанном Страуструпом, говорится, что

Вычитание указателей определяется только тогда, когда оба указателя указывают на
элементы одного массива (хотя у языка нет быстрого способа
убедиться, что это так). При вычитании одного указателя из другого,
результат — количество элементов массива между двумя указателями
(целое число). Можно добавить целое число к указателю или вычесть
целое число от указателя; в обоих случаях результатом является значение указателя.
Если это значение не указывает на элемент того же массива, что и
исходный указатель или другой, результат использования этого значения
не определено.

Например:

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 ++ говорит об этом?

Поправьте меня, если я что-то неправильно понимаю.

6

Решение

Обратите внимание, что вычитание и сравнение указателей — это разные операции с разными правилами.

C ++ 14 5.6 / 6, о вычитании указателей:

Если оба указателя не указывают на элементы одного и того же объекта массива или один за последним элементом последнего объекта массива, поведение не определено.

С ++ 14 5,9 / 3-4:

Сравнение указателей на объекты определяется следующим образом:

  • Если два указателя указывают на разные элементы одного и того же массива или его подобъектов, указатель на элемент с более высоким индексом сравнивается больше.

  • Если один указатель указывает на элемент массива или его подобъекта, а другой указатель указывает один за последним элементом массива, последний указатель сравнивается больше.

  • Если два указателя указывают на разные нестатические элементы данных одного и того же объекта или на подобъекты таких элементов, рекурсивно, указатель на объявленный позже элемент сравнивается больше, если два члена имеют одинаковый контроль доступа и если их класс не является союз.

Если два операнда p а также q сравнить равно (5.10), p<=q а также p>=q оба дают true а также p<q а также p>q оба дают ложь. В противном случае, если указатель p сравнивает больше, чем указатель q, p>=q, p>q, q<=p, а также q<p все дают true, а также p<=q, p<q, q>=p, а также q>p все дают false, В противном случае результат каждого из операторов не определен.

11

Другие решения


По вопросам рекламы [email protected]