*p++
означает *(p++)
и *p;p++
, потому что они одинаковы.
Первый ++
имеет более высокий приоритет над *
, поэтому он вычисляется первым. Тогда происходит разыменование. В обоих случаях. Дело в том, что p++
возвращает значение до приращения, как объяснено в стандарте C ++.
Наконец, как было сказано в его комментариях, в C ++ 17 порядок оценки был улучшен, так что поведение test321
четко определено. В C ++ 11 это действительно , а не .
Тот факт, что p
указывает на \0
, также хорошо определен в C ++ 17 (он также будет указывать на то же значение в C ++ 11, потому что у вас есть 4 символа, а не только 3). Даже с дополнительным ++
оно все равно будет четко определено, если только вы не разыменуете значение. Но просто указание на конец массива также хорошо определено, и поэтому векторы могут работать.