Выражение A = B = C = 3
анализируется в C как A = (B = (C = 3))
. Оператор присваивания связывается справа налево.
Однако фактическое присваивание указывается в качестве побочного эффекта выражения, и порядок, в котором возникают эти побочные эффекты, не определяется стандартом C.
Изображение в вопросе неверно, чтобы показать порядок операторов присваивания слева направо, а источник изображения следует рассматривать с подозрением. Ассоциация операторов присваивания возникает из правил грамматики в стандарте C, где 6.5.16 показывает одно правило как:
выражение присваивания : унарный -выражение оператор присваивания выражение присваивания
Тот факт, что правый операнд является выражением присваивания, означает, что в X = Y
, Y
может быть другим выражением присваивания, например Z = 4
, но X
не может быть. Поэтому A = B = C = 3
должен быть проанализирован как C = 3
, являющийся выражением присваивания внутри B = …
, а B = C = 3
должен быть выражением присваивания внутри A = …
. Сравните это с правилом для одного из аддитивных операторов в C 6.5.6:
добавочное выражение : добавочное выражение -
мультипликативное выражение
В этом правиле аддитивное выражение слева, поэтому A - B - C
обязательно группируется как (A - B) - C
.