Объяснение постикса, инфикса и префикса - PullRequest
3 голосов
/ 10 сентября 2010

Кто-нибудь может объяснить, что такое инфиксная, постфиксная и префиксная нотация в отношении языка программирования C?

Ответы [ 3 ]

5 голосов
/ 10 сентября 2010

Несколько примеров для каждого:

Инфикс:

a + b
a * b

Постфикс:

a++
f()
a[i]

Префикс (также называемый «унарный» в C и C ++):

++a
&a
-a
5 голосов
/ 10 сентября 2010

Вот хорошее обсуждение трех терминов и того, как они применяются .

Язык C использует инфиксную нотацию почти везде.Например, вы должны сделать:

x = 4 + 2;

Однако есть пара операций, использующих префиксную нотацию, например отрицание:

x = -y;  // "-" is using prefix notation

Postfix используется для таких операций, какприращение (++):

x = y++;
1 голос
/ 11 сентября 2010

Определение языка C не так однозначно в отношении инфикса, префикса и постфикса; термины «префикс» и «инфикс» даже не появляются в определении языка как такового. Вместо этого у вас есть бинарные операторные выражения (сортировка с инфиксом) и унарные выражения (сортировка с префиксом). Кроме того, группировки выражений в постфиксные, унарные и двоичные категории имеют больше общего с тем, какие выражения должны иметь более высокий приоритет, чем другие, а не там, где операторы появляются в выражении.

Например, операторы && и || выглядят так, как будто они должны быть сгруппированы с выражениями бинарных операторов, но это не так; они занимают свое собственное пространство в грамматике языка и имеют свою уникальную семантику. Операторы выбора компонентов . и -> сгруппированы с операторами постфикса, даже если они появляются между двумя выражениями, потому что выбор компонента всегда должен иметь более высокий приоритет, чем, скажем, косвенное обращение к адресу (т. Е. &a.b всегда должен анализироваться как &(a.b), а не (&a).b), а также потому, что правый операнд всегда должен быть идентификатором.

Постфиксные выражения включают следующее:

  1. Первичные выражения (имена переменных, литералы, выражения в скобках)
  2. Выражение индекса массива (a[i])
  3. Выбор компонентов (a->b, d.c)
  4. Функциональные вызовы (foo(a,b))
  5. Выражение приращения и уменьшения (a++, b--)
  6. Литералы Compount (только C99 - (int []) {1, 2, 3})

Все постфиксные выражения имеют более высокий приоритет, чем унарные или двоичные выражения.

Унарные выражения включают следующее:

  1. Постфиксные выражения
  2. Литые выражения ((int) foo)
  3. Размер выражений (sizeof foo, sizeof (int))
  4. Унарный минус (-5)
  5. Унарный плюс (+1)
  6. Логическое отрицание (!expr)
  7. Побитовое отрицание (~byte)
  8. адресное выражение (&foo)
  9. Выражение косвенного обращения (*ptr)
  10. Предварительное увеличение и уменьшение (++foo, --bar)

Унарные выражения имеют более высокий приоритет, чем двоичные выражения, но имеют более низкий приоритет, чем выражения с постфиксным выражением.

Двоичные выражения включают следующее:

  1. Мультипликативные выражения (a * b, c / d)
  2. Аддитивные выражения (a + b, c - d)
  3. Выражения сдвига (a << b, val >> 2)
  4. Реляционные выражения (a < b, c >= d)
  5. Выражения равенства (a == b, c != d)
  6. Битовые выражения (a & b, c | d, e ^ f)

Двоичные выражения имеют более низкий приоритет, чем постфиксные и унарные выражения.

В дополнение к этим группам у вас также есть выражения логических операторов (&& и ||), условные выражения (a ? b : c), которые имеют более низкий приоритет, чем двоичные выражения, выражения присваивания (a = b, c += d), последовательные выражения (a, b, c) и константные выражения (int a[42], case 5:), которые отличаются от литералов, классифицированных с постфиксными выражениями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...