Skip to content

Выражения

Yuriy Syrovetskiy edited this page Dec 26, 2017 · 1 revision

Table of Contents

Выражения

(expressions)

Выражение – это конструкция языка, составленная из констант, переменных и других выражений с помощью знаков операций и круглых скобок по правилам языка.

Выражение описывает вычисление значения в соответствии с тем, какие операции в выражении используются. Итак, важно, что у выражения есть некоторое значение, которое может быть вычислено.

Первичные выражения

(primary expressions)

В самом простом случае в выражении могут вообще не использоваться никакие операции – это и есть так называемые первичные выражения.

Иногда такие выражения называют атомарными или "атомами".

Пока нас интересует два вида таких выражений – использование константы и использование переменной по имени.

Просто константа, например числовая, – это тоже выражение:

  1

или

  12.5

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

Выражение может состоять и только из имени переменной, например:

  x

или

  my2

Значением выражения будет текущее значение той переменной, из имени которой состоит выражение. Использование такого выражения приводит к выполнению не такого уж тривиального действия, как это может показаться: для вычисления происходит обращение к области памяти, соответствующей переменной, и считыванию того значения, которое в этой области памяти в данный момент времени хранится.

Для записи более сложных выражений используются знаки операций.

Операции

(operators)

Achtung!!!
См. Терминологическая путаница: оператор

С помощью знаков операций из нескольких выражений можно составить в одно общее выражение. Эти исходные выражения называют подвыражениями (по отношению к общему выражению). Говорят также, что они являются операндами, то есть аргументами операции, объединяющей их в общее выражение.

Операнд – это аргумент операции.

Для каждой операции, которая существует в языке Си известны:

  • арность, т. е. сколько у операции должно быть аргументов-выражений; такие аргументы-выражения называют подвыражениями.
  • сигнатура, т. е.:
    • разрешённые типы аргументов.
    • тип результата (он может быть разный, в зависимости от типов использованных аргументов)
Выражение описывает вычисление значения. Вычислить выражение означает вычислить значение этого выражения. Результат выражения – это то значение, которое получено в результате вычисления выражения (т. е. термины значение выражения и результат выражения – это синонимы).

Вычисление каждого выражения начинается с вычисления значений его аргументов-выражений. После этого к вычисленным значениям применяется та операция, с помощью которой подвыражения объединены в данное выражение. Для вычисления значения подвыражений могло потребоваться вычислить значения их подвыражений и т. д.

Если операция унарная, она должна использоваться с одним аргументом, если операция бинарная – с двумя, если тернарная – с тремя.

Какие в языке Си существуют операции?

Вначале мы изучим арифметические операции.

Арифметические операции

См. Арифметические операции.

Группировка с помощью круглых скобок

Любое выражение можно заключить в круглые скобки, в результате тоже получится выражение. Значение и тип такого выражения совпадает со значением и типом выражения внутри скобок. С точки зрения вычислений получившееся выражение эквивалентно тому, которое мы поместили в скобки. Сами по себе круглые скобки в таком контексте операцией не являются (в отличие от их использования для обозначения операции вызова функции), а играют группировочную роль.

Порядок вычисления выражения

Зачем тогда заключать выражения в скобки? Иногда это полезно делать, чтобы программа была более понятна, проще читалась человеком. Основной же смысл использования скобок – определение того, из каких подвыражений состоит выражение, в котором используется несколько знаков операций, то есть определение нужного порядка вычисления подвыражений в таком выражении. Иначе он определяется приоритетом операций.

Такое выражение является правильным выражением:

  a - b * c + d

Как же будет вычисляться такое выражение? Можно расставить группировочные скобки (тут, кстати, видно, зачем они нужны):

  ((a - b) * c) + d
  a - (b * (c + d))
  (a - (b * c)) + d
  a - ((b * c) + d)
  (a - b) * (c + d)

Но какому из этих вариантов соответствует выражение без расставленных скобок? Результат-то получается существенно разный!

Порядок определяется приоритетом операций.

Приоритет операций

Чем выше приоритет операции, тем раньше она вычисляется. С точки зрения определения подвыражений в выражении без скобок, можно сказать, что то выражение, в котором используется операция с более высоким приоритетом, является подвыражением для выражения с операцией более низким приоритетом.

Для арифметических операций в языке Си приоритеты выбраны так, как это принято в математике. Т. е. приоритет мультипликативных операций выше, чем аддитивных.

Следующие выражения в результате расстановки скобок получатся различными по смыслу:

  x + y / 2 * a
  (x + y) / 2 * a
  x + y / (2 * a)
  (x + y) / (2 * a)

Ассоциативность

Операция вызова функции

выражение-0 ( выражение-1, выражение-2, . . . выражение-n)
Где выражение-0 должно идентифицировать функцию, обычно это просто имя функции.

Таким образом, операция вызова функции записывается с помощью круглых скобок. И это (n + 1)-арная операция, где n зависит от количества аргументов, которые может принимать функция.

Операция приведения типа

См. Операция приведения типа.

Операция присваивания

См. Операция присваивания.

Операции сравнения

См. Операции сравнения.

Логические операции

См. Логические операции.

Как превратить выражение в оператор

См. Оператор-выражение.

Clone this wiki locally