Ассоциативность и приоритетность в Си

И) Что означает, если (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 не было "равного приоритета", потому что у них не было одного и того же операнда. Таким образом, ассоциативность не применяется.

Другие вопросы по тегам