
Лекция №5. Выражения.
Содержание лекции.
-
Определение выражения.
-
Простейшие выражения.
-
Порядок выполнения выражений.
-
Старшинство выполнения операций в выражениях.
-
Первичные выражения.
-
Вопросы для самопроверки.
1. Определение выражения.
Выражение представляет собой объединение операций и операндов. В языке С выражением является любая правильная последовательность этих элементов. Большинство выражений в языке С по форме очень похожи на алгебраические, часто их и пишут, руководствуясь правилами алгебры.
Напомним, что операндом называется то, над чем выполняется операция. Простейшее выражение состоит из одного операнда. Опираясь на это понятие выражения, мы можем строить более сложные конструкции. Приведем несколько выражений:
100
1904 +100
a*(c-d)
x=0
x=y++
x>3
Выражениями называются компоненты программы, составленные с использованием операций, литералов, констант, переменных (включая массивы, структуры и объединения) и вызовов функций. Порядок вычисления выражений определен лишь требованиями соответ-ствия семантике операторов и соблюдения правил приоритета и порядка выполнения опера-ций. При выполнении этих требований компилятор свободен в выборе порядка вычисления выражения, даже если вычисление подвыражений может привести к побочным эффектам.
В отличие от большинства других языков, в языке Си для задания определенного порядка вычисления выражения недостаточно только соответствующей расстановки скобок, так как компилятор может произвольно переупорядочивать выражения, включающие ассоциативные и коммутативные операторы (*,+,|,^) даже при наличии скобок. Для задания желаемого порядка выполнения выражения нужно использовать дополнительные присваивания, если требуется, с использованием временных переменных.
Необходимо с осторожностью использовать выражения, при вычислении которых возможны побочные результаты, так как результаты вычисления таких выражений часто проявляются не сразу и, кроме того, зависят от используемого компилятора. Например, в результате вычисления операторов присваивания
j=3;
i=(k=j+1)+(j=5);
значение переменной i будет равно 9 или 11 в зависимости от того, какое подвыражение второй операции будет вычислено первым. Таким образом, с использованием разных компиляторов можно получить различные результаты.
2. Простейшие выражения.
Простейшими выражениями называются выражения, сформированные с использованием констант типов int, char и enum, операции sizeof, унарных операторов - и ~, бинарных операторов + * / % & | ^ << >> = = != < > <= >= и тернарной операции ?:.
Простейшие выражения используются в операторе switch, в инициализаторах границ массивов и в операторе препроцессора #if.
Важным свойством языка Си является то, что каждое выражение в Си имеет значение. Приведем несколько выражений и их значения:
Выражение Значение
-14+16 2
a=3+8 11
5>3 1
14<3 0
6+(c=3+8) 17
3. Порядок выполнения выражений.
Порядок вычисления подвыражений в выражениях языка С не определен. Компилятор может самостоятельно перестроить выражение с целью создания оптимального объектного кода. Это значит, что программист не может полагаться на определенную последовательность вычисления подвыражений. Например, при вычислении выражения
х = f1() + f2();
нет никаких гарантий того, что функция f1() будет вызвана перед вызовом f2().
Пробелы и круглые скобки.
Для повышения удобочитаемости программы при записи выражений можно использовать пробелы и символы табуляции. Например, следующие два оператора эквивалентны:
x=10/y~(127/x);
x = 10 / y ~(127/x);
Лишние скобки, если они не изменяют приоритет операций, не приводят к ошибке и не за-медляют вычисление выражения. Дополнительные скобки часто используют для прояснения порядка вычислений. В следующем примере 2-я строка читается значительно легче:
x = y/3-34*temp+127;
x = (y/3) - (34*temp) + 127;