2012-04-10 2 views
2

Говоря об ассоциативности операторов в C, я задавался вопросом, почему существуют различия между ассоциациями между операторами, которые имеют одинаковый приоритет. например, приращение постфикса и постфиксное декремент оставят ассоциативность; в то время как префикс приращения и префикс декремент имеют правую ассоциативность. Разве не просто иметь только левую или правую ассоциативность для всех одинаковых операторов приоритета?Почему существуют разные ассоциации между операторами в C?

Есть ли причины этого?

ответ

7

Не так ли просто иметь ассоциацию слева и справа для всех таких же операторов приоритета?

Да и it is the case in C. Возможно, вы предположили, что префикс и постфикс имеют тот же приоритет, который неверен. Postfix имеет более высокий приоритет, чем префикс!

Также есть еще один любопытный случай рассматривать как к почему некоторые операторы имеют определенную ассоциативность. Из Wiki,

Например, в C, присваивание а = Ь является выражением, которое возвращает значения (а именно, б преобразуется к типу А) с побочным эффектом установив к этому значению , Назначение может быть выполнено в середине выражения. (Выражение можно сделать в оператор , следующий за ним с точкой с запятой, т. Е. A = b является выражением, но a = b; - это утверждение). Правая ассоциативность оператора = допускает выражения , такие как a = b = c, которые интерпретируются как a = (b = c), , тем самым устанавливая как a, так и b значение c. Альтернатива (a = b) = c не имеет смысла, поскольку a = b не является значением l.

0

Двоичные операторы все лево-ассоциативные, за исключением оператора присваивания, который является право-ассоциативным.

Постфиксные операторы иногда (например, в K & R 2nd), которые называются право-ассоциативными, но это означает, что они имеют более высокий приоритет, чем унарные операторы.

+0

Стол в K & R (2-е изд., Стр. 48) виноват во всей путанице в отношении приоритета оператора в C. Там они неправильно помещают постфикс и префикс в ту же группу приоритетов, что просто неправильно. Это одна из многих причин, по которым K & R не следует использовать для обучения/обучения C, книга заполнена ошибками и плохой практикой. – Lundin

+0

@lundin, смешно, как книга создателей C должна быть полна ошибок! – Shahbaz

+1

@Shahbaz Это не странно, правда. Оригинальная книга была написана в темные века, до того, как C был даже стандартизирован, и до того, как хорошая практика программирования была даже изобретена. Книга была обновлена ​​до 2-го издания по стандартизации ANSI/ISO, но все еще унаследовала множество ошибок и странностей из прошлого. И книга не обновлена ​​до последних стандартов. И любая книжка по информатике старше 20 лет, вероятно, в любом случае должна считаться устаревшей. – Lundin

 Смежные вопросы

  • Нет связанных вопросов^_^