Выражения
(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)
Таким образом, операция вызова функции записывается с помощью круглых скобок. И это (n + 1)-арная операция, где n зависит от количества аргументов, которые может принимать функция.
См. Операции сравнения.
См. Логические операции.
См. Оператор-выражение.