Является ли ++*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?
Удален конструктор по умолчанию. Объекты все еще могут быть созданы... иногда
Каков смысл фразы "зарезервировано для любого использования"?
Почему вызывается деструктор для объекта, который не был удален?