if (0)
оценивает предикат 0
как двоичное значение.Двоичные значения в C используют целые числа, где ноль означает ложь, а ненулевое означает истину.Следовательно, 0 всегда будет иметь значение false.
Для бинарных операторов, ассоциативность справа или слева определяет порядок, в котором в противном случае будут обрабатываться одинаково важные операторы.Рассмотрим оператор вычитания:
37 - 10 - 4
Оба -
имеют одинаковый приоритет, поэтому что мы должны сначала оценить?Ну, -
является левой ассоциативной, поэтому мы делаем:
(37 - 10) - 4 ==> (27) - 4 ==> 23
Если бы оператор -
был правой ассоциативной, мы бы сделали:
37 - (10 - 4) ==> 37 - 6 ==> 31
Равенство (=
) является правоассоциативным, потому что мы можем объединить равенства.Итак, если мы увидим
// a and b are initialized to 0
a = b = 45
Оба =
имеют равный приоритет, поэтому мы оцениваем справа налево и делаем:
a = (b = 45) // b receives 45
a = 45 // a receives 45
Если мы должны были идти налево-направо, мы 'd получил неожиданный результат:
(a = b) = 45 // a receives 0
b = 45 // b receives 45
Однако для унарных операторов порядок может иметь значение только в том случае, если несколько унарных операторов влияют на одно и то же значение.Например, давайте сделаем:
char x = 0xFF
bool y = !~x
Эти унарные операторы ассоциативны справа, поэтому мы делаем:
!(~0xFF) ==> !(0x0) ==> true
В показанном вами примере операторы отрицания влияют на A
иE
не имел «равного приоритета», потому что у них не было одного и того же операнда.Таким образом, ассоциативность не применяется.