На сайте https://www.geeksforgeeks.org/difference-between-p-p-and-p/ написано
Приоритет префиксов ++ и * одинаков.Ассоциативность обоих справа налево.
Старшинство postfix ++ выше, чем и *, и префикс ++.Ассоциативность postfix ++ слева направо.
1-й пример кода:
int x[4] = {0, 1, 2, 3};
int *ptr = x;
cout << x[0] << " at " << &x[0] << "\n";
cout << x[1] << " at " << &x[1] << "\n";
cout << x[2] << " at " << &x[2] << "\n";
cout << x[3] << " at " << &x[3] << "\n";
cout << "*ptr = " << *ptr << " at " << ptr << "\n";
cout << "*++ptr = " << *++ptr << " at " << ptr << "\n";
cout << "++*ptr = " << ++*ptr << " at " << ptr << "\n";
cout << "*ptr++ = " << *ptr++ << " at " << ptr << "\n";
Это приводит к выводу:
0 at 0012FF1C
1 at 0012FF20
2 at 0012FF24
3 at 0012FF28
*ptr = 0 at 0012FF1C
*++ptr = 1 at 0012FF20
++*ptr = 2 at 0012FF20
*ptr++ = 2 at 0012FF24
В последнем кадреОператор, несмотря на указатель пост-инкремента, сначала увеличивает значение указателя «ptr» перед использованием.
2-й пример кода:
int cd = 7;
cout << "cd = " << cd << " at " << &cd<< "\n";
cout << "++cd = " << ++cd << " at " << &cd << "\n";
cout << "cd++ = " << cd++ << " at " << &cd << "\n";
Это обеспечивает вывод:
cd = 7 at 0012FF04
++cd = 8 at 0012FF04
cd++ = 8 at 0012FF04
В последнем выражении cout здесь обратите внимание, что cd увеличивался, а затем вызывался, несмотря на использование оператора постинкремента.
3-й пример кода:
int c = 10;
int d = 1;
cout << c << " at " << &c << "\n";
int e = c+++d;
cout << c << " at " << &c << "\n";
cout << d << " at " << &d << "\n";
cout << e << " at " << &e << "\n";
Это дает вывод:
10 at 0012FF04
11 at 0012FF04
1 at 0012FEF8
11 at 0012FEEC
Мы видим, что ++ увеличивает значение переменной ПОСЛЕ того, как к нему обращаются в операторе.
Вопрос в 3-м примере кода, в отличие от первых двух примеров кода, почему оператор постинкрементного преобразования не увеличил значениепеременная "с", прежде чем получить к нему доступ?Почему в последнем примере кода переменная не получила значение 12?