Как работает ассоциативность оператора при оценке выражения? - PullRequest
0 голосов
/ 08 мая 2019

Я изучал правило приоритета в C ++.В котором условный оператор называется ассоциативным справа налево.Я интерпретирую это как оценку выражения, начинающуюся справа и продолжающуюся слева.Итак, для приведенного ниже кода -

int a=1, b=2, c;
c=a>b? a=a*2: a=a+3;
cout<<c<<" "<<a;

Я предполагаю вывод как

8 8

Но фактический вывод равен

4 4

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

1 Ответ

6 голосов
/ 08 мая 2019

Ассоциативность говорит вам, что происходит, если у вас есть несколько экземпляров одного и того же оператора подряд.Например,

f() - g() - h()

анализируется как

(f() - g()) - h()

, а не

f() - (g() - h())

, поскольку - является левой ассоциативной, а не правой ассоциативной.

Ничто из этого не имеет ничего общего с порядком вычисления, который определяет, какая функция вызывается первой.

Что касается ?:, являющегося правой ассоциативной, это означает, что

a ? b : c ? d : e

анализируется как

a ? b : (c ? d : e)

(Это имеет немного больше смысла, если вы думаете о ?...: как об одном операторе.)

Тем не менее, ?: гарантирует оценку слева направо: первый операндвсегда вычисляется сначала, а затем точно один из других операндов (в зависимости от значения истинности первого результата).


В вашем примере

c=a>b? a=a*2: a=a+3

(пожалуйста, никогда не ставьте назначениявнутри ?:, как в реальном коде) анализируется как

c = ((a>b) ? (a=a*2) : (a=a+3))

Это полностью из-за приоритета, а не ассоциативности (у нас здесь нет нескольких идентичных операторов рядом друг с другом).

a>b оценивается первым (дает false), что приводит к a=a+3 для оценки (получая 4), которая затем присваивается c.

...