1 Вопрос: Как работает ассоциативность оператора при оценке выражения?

вопрос создан в Wed, May 8, 2019 12:00 AM

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

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

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

8 8

Но фактический результат -

4 4

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

    
0
  1. Почему вы ожидаете 8? Выполняется только одна из двух ветвей, а не обе.
    2019-05-08 15: 57: 11Z
  2. 2019-05-08 15: 57: 42Z
1 ответ                              1                         

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

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.

    
5
2019-05-08 16: 08: 00Z
  1. Это означает, что правило ассоциативности применяется только в том случае, если (в выражении присутствует другой оператор с таким же приоритетом), в противном случае - нет.
    2019-05-08 16: 04: 56Z
источник размещен Вот