Операции, операторы и выражения.
Выражения являются объектами, конструированными с использованием операции (сложения, вычитания, умножения и т.д.). Константы, переменные (включая структуры, массивы и вызовы функций) и представляют собой формулы для вычисления значений переменных.
Выражения состоят из операндов (элементов языка).
Операции классифицируются по числу участвующих в них операндов и по типу действия, которые они выполняют.
Классифицируются по числу операндов:
1) Первичные, определяющие размер, разделители и компоненты составных объектов языка.
2)Унарные – выполнения действия под одним операндом.
3)Бинарные – требуется два операнда (включая большинство операций С).
4)Тройная – требуется 3 операнда.
?: – условная операция (одна)
Порядок выполнения операндов при вычислении значения выражения определяется их приоритетами и может регулироваться с помощью круглых скобок. Приоритет можно рассматривать, как ранг операции.
Порядок можно рассматривать, как направление, в котором выполняются операции, обладающие одинаковым приоритетом.
Приоритет | Знак операции | Класс операции | Порядок |
( )[ ] –> . | Первичные | ––––> | |
!++ -- ~ - * & sizeof (тип) | Унарные | <–––– | |
* / % | Бинарные мультипликативные | ––––> | |
+ – | Аддитивные | ––––> | |
<< >> | Сдвига | ––––> | |
< > <= >= | Отношения | ––––> | |
== != | Равенство | ––––> | |
& | Побитовая и | ––––> | |
^ | Исключающая или | ––––> | |
½ | Побитовая или | ––––> | |
&& | Логическое и | ||
½½ | Логическое или | ––––> | |
?: | Условное или | <–––– | |
= + = – = *= /= %= &= ^= ½= | Присваивающая | <–––– | |
, | Запятая | ––––> |
Знак операции | Назначение операции |
() | Вызов функции |
[] | Выделение элемента массива |
––––> | Выделение элемента записи |
. | Выделение элемента записи |
! | Логическое отрицание |
++ | Увеличение на единицу |
– – | Уменьшение на единицу |
~ | поразрядное отрицание |
– | изменение знака |
* | обращение по адресу |
& | - взятие адреса |
│ sizeof | определение размера в байтах |
( тип) | преобразование типа |
* | - умножение |
/ | Деление |
% | определение остатка от деления |
+ | Сложение |
– | Вычитание |
<< | сдвиг влево |
>> | сдвиг вправо |
< | меньше, чем |
> | больше, чем |
<= | меньше или равно |
>= | больше или равно |
= = | Равно |
!= | не равно |
Для остальных операций назначения определяются названием класса операции (см. предыдущую таблицу).
Оператор “,” используется для связки нескольких выражений. Левая сторона оператора “,” всегда вычисляется, как void (т.е. не выражающее значение) – это означает, что значение выражения находящегося с правой стороны станет значением разделенного запятыми выражения.
Пример:
x = (y=3, y+1);
Скобки необходимы, т.к. операция запятая имеет более низкий приоритет по сравнению с операцией присваивания. Оператор “,” аналогичен и в русском языке.
Оператор sizeof – унарный оператор, возвращающий длину в байтах переменной или типа помещенных в скобке.
Пример:
float 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
В данной операции осуществляется сдвиг значения влево на с разрядов, в оставшиеся разряды b заносятся нули.
Пример №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.
Горизонтальные преобразования выполняются всегда, вертикальные по мере необходимости.
Дата добавления: 2016-04-14; просмотров: 659;