ПРИМЕР 7 Группировка выражения не полностью определяет его оценку. В следующем фрагменте:
#include <stdio.h> int sum; char *p; /* ... */ sum = sum * 10 - '0' + (*p++ = getchar());
оператор выражения сгруппирован, как если бы он был записан как
sum = (((sum * 10) - '0') + ((*(p++)) = (getchar())));
но фактическое приращение p может происходить в любое время между предыдущей точкой последовательности и следующей точкой последовательности (;), а вызов getchar может происходить в любой момент до того, как потребуется его возвращаемое значение.
В основном я понимаю это как неопределенное поведение - либо *p = getchar(); p++;
ИЛИ p++; *p = getchar()
. Обратите внимание, что ;
подразумевает точку последовательности, но во всем выражении нет других точек последовательности.
Так что этот синтаксис бесполезен. И, в значительной степени, ++ и - для присвоения указателя бесполезны. Верно?
p++
, потому что p вычисляется только один раз в выражении. - person Paul R   schedule 29.04.2013(*p++ = getchar())
p++
является лишь побочным эффектом,p
никогда не упоминается во втором месте того же оператора, поэтомуp++
не может вызывать ошибки точки последовательности. (кроме случаев, когда он указывает наsum
или где-то внутри буфера ФАЙЛА stdin) - person wildplasser   schedule 29.04.2013p* = getchar()
на*p = getchar()
- person Rüppell's Vulture   schedule 29.04.2013