Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка по С Живицкая (Мет пособие).doc
Скачиваний:
112
Добавлен:
15.06.2014
Размер:
2.11 Mб
Скачать

2.2.Операции, операторы и выражения.

Выражения являются объектами конструированными с использованием операции (сложения, вычитания, умножения и т.д.). Константы, переменные (включая структуры, массивы и вызовы функций) и представляют собой формулы для вычисления значений переменных.

Выражения состоят из операндов (элементов языка).

Операции классифицируются по числу участвующих в них операндов и по типу действия, которые они выполняют.

Классифицируются по числу операндов:

1) Первичные, определяющие размер, разделители и компоненты составных обьектов языка.

2) Унарные – выполнения действия под одним операндом.

3) Бинарные – требуется два операнда (включая большинство опера-

ций С).

4) Тройная – требуется 3 операнда.

?: – условная операция ( одна )

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

Порядок можно рассматривать, как направление, в котором выполняются операции, обладающие одинаковым приоритетом.

Приоритет

Знак операции

Класс операции

Порядок

1

( )[ ] –> .

Первичные

––––>

2

!++ -- ~ - *

& sizeof (тип)

Унарные

<––––

3

* / %

Бинарные мультипликативные

––––>

4

+ –

Адитивные

––––>

5

<< >>

Сдвига

––––>

6

< > <= >=

Отношения

––––>

7

== !=

Равенство

––––>

8

&

Побитовая и

––––>

9

^

Исключающая или

––––>

10

Подбитовая или

––––>

11

&&

Логическое и

12



Логическое или

––––>

13

?:

Условное или

<––––

14

= + = – = *= /=

%= &= ^= =

Присваивающая

<––––

15

,

Запятая

––––>

Знак опреации

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

()

Вызов функции

[]

Выделение элемента массива

––––>

Выделение элемента записи

.

Выделение элемента записи

!

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

++

Увеличение на единицу

– –

Уменьшение на единицу

~

поразрядное отрицание

изменение знака

*

обращение по адресу

&

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

│ sizeof

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

( тип )

преобразование типа

*

- умножение

/

Деление

%

определение остатка от деления

+

Сложение

Вычитание

<<

сдвиг влево

>>

сдвиг вправо

<

меньше, чем

>

больше, чем

<=

меньше или равно

>=

больше или равно

= =

Равно

!=

не равно

Для остальных операций назначения определяются названием класса операции (см. предыдущую таблицу).

Оператор “,” используется для связки нескольких выражений. Левая сторона оператора “,” всегда вычисляется, как void ( т.е. не выражающее значение ) – это означает, что значение выражения находящегося с правой стороны станет значением разделенного запятыми выражения.

Пример:

x= (y=3,y+1 );

Скобки необходимы, т.к. операция запятая имеет более низкий приоритет по сравнению с операцией присваивания. Оператор “,” аналогичен и в русском языке.

Оператор sizeof – унарный оператор возвращающий длину в байтах переменной или типа помещенных в скобке.

Пример:

ftoat f;

printf ( " % f ", sizeof f );

printf( " %d",sizeof(int) );

В результате выполнения этого оператора выдаются значения 4 и 2.

Для вычисления размера типа, тип помещается в круглые скобки.

Для имени переменной круглые скобки необязательны.

Пример:

1. а! = b

Дает результат 1, если а не = b, и 0 в противном случае.

Операции + + и - - можно записывать как перед операндом, так и после него ++а и а++. В первом случае значение операнда изменяется перед его использование в соответствующем выражении, а во втором после его использования.

Пример №1.

|b = 1;

с = 2;

а = b+с++;

Получены такие значения = 3, а = 3

Пример №2.

b = 1;

с = 2;

а = b+ (++c);

Получены такие значения

с = 3;

а = 4;

Пример №3.

а = ~ b;

b = 1001

а = 0110

Пример №4.

а = b % c

b= 5

c= 2

a= 1

Эту операцию нельзя использовать для переменных типа float и double.

Пример №5.

а = b << c

b= 1001

c= 2

a= 0100

В данной операции осуществляется сдвиг значения влево на С разрядов в оставшиеся разряды в заносятся нули.

Пример №6.

а = = b

Дает результат единица, если а = b, и 0 в противном случае.

Остальные операции отношения аналогичны: результат = 1, если истинно, и 0 если ложно.

Пример №7.

y = x ? a:b

( Тройная операция ) В этом выражении y = a, если x не = 0 и y = b,

если х = 0

Пример №8.

y= (a>b) ?a:b;

Позволяет присвоить переменной y значение большей переменной а или b.

y = max (a,b) – максимальное значение между а и b.

Пример №9. ( коньюнкция (логическое "и") )

а = b & c;

если b = 1010 логическое умножение

c = 0110 1*0 0*1 1*1 0*0

то а = 0010

Пример:Поразрядная дизъюнкция ( "или" )

а = b|с

b = 1010, с = 0110, то а = 1110

1 и 0 выбирают 1, 0 и 1 выбирают 1, 1 и 1 выбирает 1,

0 и 0 выбирает 0

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

а = b ^ c

b= 1100

c= 0110

a= 1010

Если соответствующие разряды имеют различные значения, то результатом будет 1, в противном случае 0.

В языке С а = а + 5; аналогично записи а + = 5. В общем виде

а + = b а = а + b.

По аналогии используются другие бинарные операции.

При выполнении арифметических операций, если в выражении появляются операнды различных типов в С действуют следующие правила преобразования к некоторому общему типу.

1) Операторы типа char и short преобразуются к типу int. А типа float к типу double.

2) Если один из 2-х операндов имеет тип double другой операнд преобразуется к типу double результат имеет тип double.

3) Если один из операторов имеет тип unsigned, то и другой операнд преобразуется к типу unsigned результат unsigned.

4) Если один из операндов имеет тип long другой тоже преобразуется к long, результат long.

5) Если не выполнено условие 1.4 оба операнда должны быть типа int и результат имеет тип int.

Схема выполнения арифметических преобразований.

double<────float

long

unsigned

int <───── char, short.

Горизонтальные преобразования выполняются всегда, вертикальные по мере необходимости.