Прогнозировать результат с помощью указателей - PullRequest
0 голосов
/ 12 июля 2020

В приведенном ниже коде меня смущает работа 3-х строчки. Если кто объяснит, буду очень благодарен. Спасибо.

#include< iostream >
using namespace std;

int main()
{
1. char s[]="abcdef";
2. char *p=s;
3. *p++=*++p;
4. cout<<s;
5. return 0;
}

1 Ответ

1 голос
/ 12 июля 2020

Перед строкой *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

...