Запрос приоритета оператора C ++ - PullRequest
0 голосов
/ 17 сентября 2018

На сайте 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?

1 Ответ

0 голосов
/ 17 сентября 2018

"почему постинкрементный оператор не увеличил значение переменной "c", прежде чем получить к нему доступ "

Потому что это пост оператор приращения. Он оценивает свой операнд и увеличивает его впоследствии.

То есть int e = c+++d; интерпретируется как "присваивать c + d e, а также приращение c."

В первых двух примерах вы написали код, который изменяет значение переменной и оценивает эту переменную без каких-либо точек последовательности для ограничения порядка операций.

...