Является ли ++*ptr++ некорректным поведением в C++?
Я столкнулся с вопросом на тесте (не хотел его придумывать сам, но тест это задал. Я понимаю, что код плохой) о том, как оценить выражение ++*ptr++
.
int Ar[] = { 6, 3, 8, 10, 4, 6, 7 };
int *Ptr = Ar;
cout << ++*Ptr++;
Однако у меня есть подозрение, что это может привести к неопределенному поведению, так как оно может быть как (++*ptr)++
, так и ++(*ptr++)
. Верно ли это? Я не слишком хорошо знаком с документацией и не смог найти информацию по этому поводу.
1 ответ(ов)
Ваше выражение
++*Ptr++;
не вызывает неопределённого поведения и оценивается как ++(*(Ptr++))
. Давайте разберём, что здесь происходит:
Ptr++;
— это постинкремент, который означает, что адрес, на который указываетPtr
, будет увеличен на 1, но именно в этом выраженииPtr
не будет изменён. Он указвает на то же самое значение, пока не произойдёт переход к следующему выражению.*Ptr;
— здесь происходит разыменование указателя, то есть мы получаем значение по тому адресу, на который указываетPtr
в данный момент. Если, например,Ptr
изначально указывал на массивAr
, то мы получаем значение по адресуAr[0]
, которое, допустим, равняется 6.++*Ptr;
— здесь происходит инкремент значения, на которое указываетPtr
. В результате, значение по адресу, на который указываетPtr
, изменяется:Ar[0]
становится 7.
Обратите внимание, что постинкремент Ptr++
будет оценен так:
Ptr;
— в этом выраженииPtr
остаётся неизменным и указывает на тот же адрес.Ptr = Ptr + 1;
— в следующем выраженииPtr
теперь будет увеличен и будет указывать на следующий элемент.
Таким образом, все операции здесь безопасны и не приводят к неопределённому поведению, так как они корректно следуют стандартам языка C.
Правила использования символа подчеркивания в идентификаторах C++
Что говорит стандарт C++ о размерах типов int и long?
Удален конструктор по умолчанию. Объекты все еще могут быть созданы... иногда
Каков смысл фразы "зарезервировано для любого использования"?
Почему вызывается деструктор для объекта, который не был удален?