Ассоциативность и приоритетность в Си
И) Что означает, если (0) означает?
Каждый раз, когда я использую его, чтобы проверить, какой вывод я получу, он возвращает ложную часть.
Это эквивалентно if(0 == 0), в случае которого оценивается истинная часть.
II) Ассоциативность логического НЕ! справа налево.
Ссылка: http://www.liv.ac.uk/HPC/HTMLF90Course/HTMLF90CourseNotesnode94.html
Второй пример в ссылке логических операторов:
Но в соответствии со строкой "два подвыражения, содержащие монадическое.NOT., Эффективно оцениваются первыми, так как два из них слева, сначала выполняется.NOT.A, а затем.NOT.E.", Левое NOT оценивается первый, но первым должен быть оценен тот, который справа...???
3 ответа
I) В C 0 ложно, а все остальное верно. Так с if (0)
условие всегда будет ложным, а тело никогда не будет выполнено, потому что 0 всегда ложно.
if (0 == 0)
совершенно другой, потому что 0 на самом деле равен нулю, а выражение 0 == 0
оценивается как истина, поэтому тело if
выполнен.
II) Ассоциативность операторов определяет, что происходит, когда у вас есть неоднозначности от нескольких операторов с одинаковым приоритетом. Например, что должно произойти в a - b - c
? Если b - c
оцениваться первым или a - b
? Неважно, в каком порядке вы их выполняете, потому что если a = 1, b = 2 и c = 3, a - (b - c)
является 2
, но (a - b) - c
это -4. Но поскольку вычитание является левоассоциативным, мы можем знать, что a - b
будет оцениваться в первую очередь, поэтому ответ на a - b - c
равно -4, когда а = 1, б = 2, с = 3.
Несмотря на все сказанное, я не могу вспомнить случай, когда ассоциативность логического оператора not имела бы значение, и ассоциативность оператора не определяет, в каком порядке он будет выполняться, если он разделен операторами различного приоритета.
i) в C 0 означает ложь, поэтому if(0)
всегда будет прыгать к else
(если там). это противоположность if(0==0)
, (или просто if(1)
), которая сделает истинную часть.
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
Если бы мы пошли налево-направо, мы получили бы неожиданный результат:
(a = b) = 45 // a receives 0
b = 45 // b receives 45
Однако для унарных операторов порядок может иметь значение только тогда, когда несколько унарных операторов влияют на одно и то же значение. Например, давайте сделаем:
char x = 0xFF
bool y = !~x
Эти унарные операторы ассоциативны справа, поэтому мы делаем:
!(~0xFF) ==> !(0x0) ==> true
В приведенном вами примере операторы отрицания влияют на A
а также E
не было "равного приоритета", потому что у них не было одного и того же операнда. Таким образом, ассоциативность не применяется.