Ассоциативность и приоритетность в Си - PullRequest
0 голосов
/ 20 ноября 2011

i) Что означает, если (0) означает?

Каждый раз, когда я использую его для проверки того, какой вывод я получу, он возвращает ложную часть.

Это эквивалентно if (0 == 0), в случае которого вычисляется истинная часть.

ii) Ассоциативность логического НЕ!справа налево.

Ссылка: http://www.liv.ac.uk/HPC/HTMLF90Course/HTMLF90CourseNotesnode94.html

Второй пример в ссылке логических операторов:

Но согласно строке "два подвыражения, содержащие монадический.NOT. Эффективно оцениваются первыми, так как есть два из них, крайний левый, сначала выполняется .NOT.A, затем следует .NOT.E. ", Сначала выполняется левое NOT, но первым должен быть оцененодин справа ... ???

Ответы [ 3 ]

4 голосов
/ 20 ноября 2011

I ) В C 0 равно false, а все остальное верно. Таким образом, при if (0) условие всегда будет ложным, а тело никогда не будет выполнено, потому что 0 всегда ложно.

if (0 == 0) полностью отличается, потому что 0 фактически равен нулю, а выражение 0 == 0 оценивается как true, поэтому тело 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, когда a = 1, b = 2, c = 3.

Несмотря на это, я не могу вспомнить случай, когда ассоциативность логического оператора not имела бы значение, и ассоциативность оператора не определяет, в каком порядке он будет выполняться, когда он разделен операторами другой приоритет.

3 голосов
/ 20 ноября 2011

i) в C 0 означает ложь, поэтому if(0) всегда будет переходить к else (если есть).это противоположность if(0==0), (или просто if(1)), которая сделает истинную часть.

0 голосов
/ 20 ноября 2011

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

...