Перед строкой *p++=*++p;
, p
указывает на начало массива s
.
++p
в правой части строки будет увеличивать p
на единицу и теперь он указывает на b
. Разыменование его с помощью *
даст значение b
, поэтому правая часть оценивается как b
.
В левой части, поскольку используется оператор пост-инкремента, значение p
сразу не изменится. Таким образом, значение b
из RHS будет установлено в ту же ячейку памяти. Из-за оператора постинкремента p
будет указывать на символ c
массива.
Таким образом, массив символов останется прежним после этой строки, и поэтому будет напечатано abcdef
. Однако p
будет указывать на символ c
массива.
Обратите внимание, что приведенное выше верно только с c ++ 17. From en.cppreference.com / w / cpp / language / eval_order : В каждом простом выражении присваивания E1 = E2 и в каждом выражении составного присваивания E1 @ = E2, каждое вычисление значения и побочный эффект E2 упорядочивается перед каждым вычислением значения и побочным эффектом E1