Операции, операторы и выражения.
Выражения являются объектами, конструированными с использованием операции (сложения, вычитания, умножения и т.д.). Константы, переменные (включая структуры, массивы и вызовы функций) и представляют собой формулы для вычисления значений переменных.
Выражения состоят из операндов (элементов языка).
Операции классифицируются по числу участвующих в них операндов и по типу действия, которые они выполняют.
Классифицируются по числу операндов:
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; просмотров: 761;
