Порядок оценки в C (для выражения с * и ++)

Если мы имеем

int i = 5; /*line 1*/
int *p = &i; /*line 2*/
*p++; /*line 3*/ 

Каков порядок оценки для строки 3? (Я знаю, что после этого p может указывать на что-то странное, но меня интересует не правильная адресация памяти, а порядок оценки, поскольку и *, и ++ имеют одинаковый приоритет)


person Alex    schedule 09.05.2017    source источник
comment
Нет, они не имеют одинакового приоритета. Постфиксная форма ++ имеет более высокий приоритет, чем *, в отличие от префиксной формы.   -  person StoryTeller - Unslander Monica    schedule 09.05.2017
comment
Простой способ запомнить, что ++ увеличивает указатель, состоит в том, чтобы отметить обычную однострочную реализацию strcpy: while(*dst++ = *src++);, которая потерпит неудачу, если ++ увеличит фактические символы вместо указателей.   -  person Groo    schedule 09.05.2017
comment
Приоритет оператора — это обнаруживаемая вещь.   -  person Oliver Charlesworth    schedule 09.05.2017
comment
@OliverCharlesworth Я использовал таблицу приоритетов из языка программирования C (K&R, стр. 48), где * и ++ находятся в одной строке.   -  person Alex    schedule 09.05.2017


Ответы (3)


Нет, инкремент постфикса имеет более высокий приоритет.

В вашем случае побочный эффект приращения будет иметь место после оценки значения note (с оператором разыменования). Однако результат оценки значения отбрасывается (вы не предприняли никаких усилий для сохранения результата).

Итак, наконец, результат будет эквивалентным как p++;


Примечание:

Цитата из C11, глава §6.5.2.4 (выделено мной)

Результатом постфиксного оператора ++ является значение операнда. В качестве побочного эффекта значение объекта операнда увеличивается (то есть к нему добавляется значение 1 соответствующего типа). См. обсуждение аддитивных операторов и составного присваивания для получения информации об ограничениях, типах и преобразованиях, а также о влиянии операций на указатели. Вычисление значения результата выполняется до побочного эффекта обновления сохраненного значения операнда. [...]

person Sourav Ghosh    schedule 09.05.2017
comment
Итак, даже если ++ (имея более высокий приоритет) должен быть оценен первым, он отложен до тех пор, пока не будет оценен * p? - person Alex; 09.05.2017
comment
@Alex Да, приращение - это побочный эффект, значение постфикса ++ - это значение самого операнда, как уже было выделено в моем ответе. - person Sourav Ghosh; 09.05.2017
comment
@Alex - Действительно - порядок оценки и приоритет по существу не связаны; см. stackoverflow.com/a/5475260/129570. - person Oliver Charlesworth; 09.05.2017

*p++ обрабатывается как *(p++), поскольку приоритет постфикса ++ выше, чем *.

person msc    schedule 09.05.2017
comment
ты уверен в этом? - person Sourav Ghosh; 09.05.2017
comment
@SouravGhosh Да, сэр. - person msc; 09.05.2017
comment
@SouravGhosh - семантически это правильная оценка. Компилятор, вероятно, упорядочит загрузку перед приращением, но для абстракции C, как определено стандартом, *p++ семантически эквивалентен *(p++), как сказано rsp. - person StoryTeller - Unslander Monica; 09.05.2017
comment
@StoryTeller и rsp - правильно, спасибо за подтверждение. :) - person Sourav Ghosh; 09.05.2017
comment
Почему тогда все строковые функции сделаны так: while (*str) something = *str++. Если строка abcd, то значения, установленные в something, должны быть bcd в соответствии с вашим ответом и всеми комментариями! *p++ оценивается таким образом, что сначала выполняется чтение/запись текущего адреса p, а затем выполняется приращение. - person tilz0R; 09.05.2017