В третьем издании языка программирования 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 ++ говорит об этом?
Поправьте меня, если я что-то неправильно понимаю.
Обратите внимание, что вычитание и сравнение указателей — это разные операции с разными правилами.
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
, В противном случае результат каждого из операторов не определен.