Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
119
Добавлен:
13.03.2016
Размер:
470.02 Кб
Скачать

1.2.5. Выражения в Си

Приведем очевидное определение: выражение- этооперанды, соединенные знакамиопераций. В качестве операндов могут использоваться переменные, константы, результаты обращения к функциям5и выражения, заключенные в круглые скобки. Способы описания переменных и констант мы рассмотрели в предыдущем параграфе; заметим, что пока мы знакомы только с простыми переменными; конечно, в выражении может участвовать и элемент массива (переменная с индексом – см. п. 1.5), и поле структуры или объединения (см. п.3.2).

В таблице 3 приведены знаки операций, определенные стандартом языка Си. В первом столбце таблицы указан ранг (приоритет операций). В первую очередь выполняются операции ранга 1, во вторую - ранга 2, и т. д. Операции одного ранга выполняются последовательно, направление выполнения операций (ассоциативность) - справа налево () или слева направо () - указано в третьем столбце. Если один и тот же знак операции встречается в таблице дважды, то первое его появление (с меньшим рангом) соответствует унарной операции, а второе - бинарной.

Таблица 3. Операции Си.

Ранг

Обозначение

операции

Название операции

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

1

( ) [ ]

->

.

круглые и квадратные скобки

косвенный выбор компонента структурированного объекта

прямой выбор компонента структурированного объекта (см. п.3.2)

2

!

+ -

++

--

&

*

(тип)

sizeof

логическое отрицание

поразрядное инвертирование внутреннего двоичного кода

унарный плюс и минус

инкремент (увеличение на 1)

декремент (уменьшение на 1)

взятие адреса

взятие содержимого (см. п.1.5.3)

приведение к типу

определение размера в байтах

3

* /

%

арифметическое умножение и деление

получение остатка от деления нацело

4

+ -

арифметические сложение и вычитание

5

<< >>

поразрядного сдвига

6

< <= > >=

отношения (меньше, меньше или равно и т. д.)

7

== !=

отношения (равно, неравно)

8

&

Поразрядная конъюнкция

9

^

Поразрядное исключающее "или"

10

|

Поразрядная дизъюнкция

11

&&

конъюнкция (логическое "и")

12

||

дизъюнкция (логическое "или")

13

?

условная операция

14

=

операция=

присваивание

составное присваивание

15

,

операция "запятая"

Рассмотрим особенности некоторых операций. Заметим, что скобки в языке Си в ряде случаев рассматриваются как бинарные операции. Так, например, например, квадратные скобки при указании индексов элемента массива и круглые скобки при обращении к функции (подробнее с этим можно ознакомиться в [2], с.42).

Унарная операция инкремент (увеличение на единицу или автоувеличение) имеет две формы: префиксную(++имя_переменной) и постфиксную (имя_переменной++). В случае префиксной формы увеличение значения операнда происходит до его использования, в случае постфиксной - после. Для лучшего понимания различия этих форм полезно проанализировать 2 фрагмента программы:

int i=1,c;

1-й фрагмент

2-й фрагмент

с=2*i++;/*”=” – знак присваивания*/

с=2*++i;

/*в результатеi равно 2, с равно 2*/

/*i равно 2, с равно4*/

Аналогично существуют префиксная и постфиксная формы декремента. Заметим, что операции инкремент и декремент могут использоваться не только в выражениях, но и как самостоятельный оператор, увеличивающий или уменьшающий переменную на единицу.

Операция sizeof вычисляет размер в байтах для типа операнда. Она имеет две формы: sizeof(выражение)иsizeof(тип). Она использует в том случае, когда нужно построить алгоритм, обрабатывающий выражения различных типов.

Операция (тип)выражение осуществляет приведение выражения к типу, указанному в скобках.

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

Если говорить о числовых типах, то в Си строго выдерживается правило: если в выражении все операнды одного типа, то и результат имеет тот же тип. Поэтому при делении двух целых операндов получается целый результат. Например, значением выражения 5/2 будет 2 (а не 2.5). Для получения вещественного результата надо использовать вещественные операнды (5.0/2.0).

В Си в качестве знака присваивания используется символ "=". Этот символ часто называется простым присваиванием в отличие от присваивания составного (см., например, [2]) Операция присваивания имеет вид: имя переменной=выражение;

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

В Си, однако, присваивание является не только оператором, но и операцией (см. таблицу 3, операции ранга 14). Рассмотрение его как операции делает допустимой в отличии, например, от Паскаля цепочку: a=b=c=d=0, в результате которой все переменные, начиная с самой правой, получают значение 0 (или, конечно, любое другое значение).

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