Подтвердить что ты не робот

Будет ли "& a + 1> & a" вызывать поведение undefined

Гарантирует ли c99/c++03, что &a+1 > &a всегда верно?

например, существует (c-like) std::copy и

int a = 0 ;
int b[9] ;
std__copy(&a , &a+1 , b) ;

Всегда ли это работает?

4b9b3361

Ответ 1

Да, C99 имеет специальную формулировку, чтобы сказать, что при работе с адресами любой данный объект a будет действовать как массив из 1 элемента, так что &a+1 будет действительным (§6.5.6/7):

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

Хотя номер раздела отличается (§6.3.6), C90 дает такое же требование.

С++ имеет то же требование в §5.7/4 (тот же номер раздела в С++ 03 и С++ 11).

В С++ вы можете сравнивать адреса произвольных объектов (одного и того же типа) с помощью std::less, даже если встроенный оператор < не даст значимых результатов (например, два объекта, которые не являются частями одного и того же массив) (§20.8.5/7):

Для шаблонов greater, less, greater_equal и less_equal специализации для любого типа указателя дают полный порядок, даже если встроенные операторы <, > , < =, >= do not.

Также обратите внимание, что хотя вы можете сформировать эти адреса и можете сравнивать их с адресом объекта, вы не можете разыменовать эти указатели (ну, компилятор, вероятно, не остановит вас, если вы попытаетесь, но результат будет undefined).

Ответ 2

Да, это гарантировано на С++ (не знаю о C). Специфика заключается в том, что переменная типа T эквивалентна массиву одного элемента того же типа, и вы всегда можете получить указатель за пределами массива.