Пример того, что = (присвоение) является правоассоциативным

#c #parsing #variable-assignment

#c #синтаксический анализ #присвоение переменной

Вопрос:

Где ассоциативность оператора = присваивания будет иметь значение в выражении? Я думал, что ассоциативность относится к операндам, которые совместно используют оператор, но как это будет работать в случае присваивания? Вот несколько примеров, которые (могут) иметь отношение к делу::

 x = 1
x   2 = y   3 = z   5
 

Означает ли это просто, что в приведенных выше заданиях мы должны были бы:

 y   3 = z   5
 

Сделано раньше, например:

 x   2 = y   3
 

Или какие другие сценарии существуют, где ассоциативность присваивания «имеет значение»?

Комментарии:

1. x 2 = y 3 Это недопустимый C, так что это не очень хороший пример. Ассоциативность имеет значение в таких случаях , как int x, y = 0, z = 1; x = y = z; .

2. Лучшим примером было бы a = b = c 1 . Вы не хотите, чтобы это означало a = b , что за ним следует b = c 1 .

3. В ваших примерах вы пробовали их, чтобы посмотреть, компилируются ли они?

Ответ №1:

Ваши примеры ничего не демонстрируют, потому что ассоциативность вступает в игру только тогда, когда у вас есть несколько операторов с одинаковым приоритетом (или один и тот же оператор) рядом друг с другом.

Рассмотрим x = y = 42 , который устанавливает обе переменные равными 42.

Из-за правоассоциативности оно анализируется как x = (y = 42) , где y = ... возвращает новое значение y , равное 42 .

Вот почему это работает. Если = было левоассоциативным и оно было проанализировано как (x = y) = 42 , то:

  • В C он вообще не компилировался бы, потому x = ... что возвращает rvalue, а не lvalue , и они не могут быть назначены.
  • В C , где присваивания возвращают значения lvalues , это будет работать так x = y; x = 42; , что далеко не интуитивно понятно.

Комментарии:

1. В C (x = y) = 42; это будет работать, x=y, x=42; не так ли?