Главная страница
Случайная страница
КАТЕГОРИИ:
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
Операции и выражения
Выражение - это правило (например, формула) для вычисления нового значения. Выражения в Си могут быть арифметические, логические, условные, над символами и строками и над адресами. Тип выражения определяется типом результата, т. е. значением, которое формируется при выполнении последней операции выражения. Выражения формируются из операндов, операций и круглых скобок, с помощью которых можно задать требуемый порядок выполнения его операций. В качестве операндов могут быть константы, переменные и результаты функций. Результатом выполнения выражения может быть значение одного из допустимых типов: арифметического (целого или вещественного) или символьного. Тип результата определяется как типом операндов, так и типом операций, выполненных над операндами.
Операции делятся на унарные, которые выполняются над одним операндом, и бинарные – над двумя операндами.
Унарные операции:
&
| операция получения адреса операнда;
| ‘*’
| операция обращения по адресу;
| ‘-‘
| унарный минус, изменяет знак арифметического операнда;
| +
| унарный плюс, введен для симметрии с унарным минусом;
| ~
| инвертирует значение каждого бита операнда;
| !
| НЕ – логическое отрицание операнда;
| ++
| увеличение на 1. Эта операция имеет две формы – префиксная операция и постфиксная. Префиксная – увеличение значения операнда на 1 до его использования. Постфиксная – увеличение значения операнда на 1 после его использования;
| --
| уменьшение на 1;
| sizeof
| операция вычисления размера (в байтах) для объекта того типа, который имеет операнд;
| Бинарные операции
Аддитивные
| +
| бинарный плюс;
| -
| бинарный минус;
| *
| умножение операндов арифметического типа;
| /
| деление операндов арифметического типа. При целочисленных операндах абсолютное значение результата округляется до целого;
| %
| получение остатка от деления целочисленных операндов. При неотрицательных операндах остаток положительный. В противном случае – зависит от компилятора. В нашем случае 13%-4 равно 1, а -13%4 равно -1
| Операции сдвига
| < <
| Операции сдвига < < и > > выполняют сдвиг левого операнда влево или вправо на количество разрядов, заданное правым операндом. Таким образом, выражение х < < 2 сдвигает х влево на 2 разряда; это эквивалентно умножению х на 4. Таким образом, операции сдвига могут применяться для деления или умножения целого значения на число, равное степени 2.
| > >
| Поразрядные операции (битовые)
Работают в двоичной системе
| &
x& y
| Поразрядная коньюнкция (И) битовых представлений целочисленных операндов. Каждый бит результата будет содержать 1, если в соответствующих битах операндов тоже стоят 1. Например
10& 15 (1010& 1111) будет 10 (1010)
| |
| Поразрядная дизъюнкция (битовое ИЛИ). Каждый бит результата будет содержать 1, если хотя бы в одном из соответствующих битов операндов стоит 1. Например
10|15 (1010|1111) будет 15 (1111)
| ^
| Поразрядное исключающее ИЛИ. Каждый бит результата будет содержать 1, если только в одном из соответствующих битов операндов стоит 1. Например
10^15 (1010^1111) будет 5 (0101)
| Операции отношений (сравнения)
| <
| 1) Используются для сравнения значений. Результат целочисленный – 0(ложь) или 1(истина). Примеры операций отношения:
int a, b, i, n; float с, d;
а = d > с; b = i + n < 100;
| >
| < =
| > =
| ==
| ! =
| Логические бинарные операции
| & &
| Коньюнкция арифметических операндов. Результат целочисленный – 0(ложь) или 1(истина)
| ||
| Дизъюнкция арифметических операндов. Результат целочисленный – 0(ложь) или 1(истина)
|
| Операндами этих логических операций могут быть результаты выражений любого типа. Но перед выполнением логических операций значения результатов выражений-операндов преобразуются в логические значения истина - 1 или ложь - 0. Все значения, отличные от 0, интерпретируются как истинные - 1, а если значение равно 0, то оно ложно. Результат логической oneрации равен 1, если логическое выражение истинно, и результат равен 0, если логическое выражение ложно.
Таблица 3. Результат логических операций
Операнд-1
| Операнд-2
| Результат операций
|
!
| & &
| ||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Операции присваивания
| =
| Простое присваивание: присвоить значение выражения-операнда из правой части операнду левой части. p=10.3-2*x
С помощью одного оператора присваивания могут получить новое значение несколько переменных. Например, переменные а, b, с, е получат значение, равное нулю: а = b = с = е = 0;
В одном операторе операция присваивания может использоваться несколько раз. Например: а = (b = с) * d; здесь сначала переменной b присваивается значение переменной с, а затем вычисляется выражение b*d и результат присваивается переменной а.
| *=
| Присваивание после умножения: присвоить операнду левой части произведение значений обоих операндов. То есть p*=2 эквивалентно p=p*2
| /=
| Присваивание после деления. p/=2-x эквивалентно p=p/(2-x)
| %=
| Присваивание после деления по модулю. присвоить операнду левой части остаток от целочисленного деления значения левого операнда на значение правого. p%=3 эквивалентно p=p%3
| +=
| Присваивание после суммирования
| -=
| Присваивание после вычитания. p-=4-z эквивалентно p=p-(4-z)
| & =
| Присваивание после поразрядной коньюнкции. e& =44 Û e=e& 44
| |=
| Присваивание после поразрядной дизъюнкции. e|=c Û e=e|c
| ^=
| Присваивание после поразрядного исключающего ИЛИ
| < < =
| Присваивание после сдвигов разрядов влево. a< < =4 Û a=a< < 4
| > > =
| Присваивание после сдвигов разрядов вправо
| Операции выбора компонентов структурированного объекта
| . (точка)
| Используются со сложными типами данных – структурами и объединениями.
| ->
| Запятая в качестве операции
| ,
| Несколько выражений, разделенных запятыми вычисляются слева направо. В качестве результата – значение и тип самого правого выражения. Например:
int a, b;
a=(b=3, 3*b)
printf(“%d”, a) //даст результат 9
| Скобки
| (), []
| Играют роль бинарных операций при вызове функций и индексировании элементов массива.
| Условная трехместная операция
| ?:
| Используется с тремя операндами (тернарная). Синтаксис:
Выражение1? выражение2: выражение3
Первым вычисляется значение выражения1. Если оно истинно, то есть не равно 0, то вычисляется значение выражения 2, которое и становится результатом. Если при высичлении выражения1 получится 0, то вычисляется и берется в качестве результата выражение3.
Пример:
x< 0? -x: x // выражение возвращает абсолютную величину x
|
При выполнении смешанных выражений автоматически производится преобразование операндов к одному типу в соответствии с приоритетами. Ниже приведен порядок следования типов по возрастанию их старшинства:
char< int< long< float< double
Автоматически выполняются следующие преобразования типов:
1. char преобразуется в int, float в double
2. если старшим типом является double, то все остальные типы преобразуются в double. Таким же будет и тип результата.
3. если старшим типом является long, то все остальные типы преобразуются в long. Таким же будет и тип результата.
4. если старшим типом является unsigned, то все остальные типы преобразуются в unsigned. Таким же будет и тип результата.
Если не выполняется ни одно из предыдущих условий и выражение содержит значение типа int, то результат будет int. Существует одно исключение из этих правил. Если выражение содержит типы long и unsigned, то unsigned не преобразуется к long. Типом результата будет usigned long.
Часто возникают ситуации, когда желательно вместо целых значений использовать вещественные.
Рассмотрим пример:
int x, y;
float z;
x=10;
y=100;
z=x/y;
В результате вычислений переменная z получит значение 0 как целое число, а не 0.1 как вещественное. В подобных ситуациях часто прибегают к явному преобразованию типов с помощью следующей конструкции:
(имя-типа) выражение
где тип –корректный тип данных С. Например, для получения правильного значения при вычислении выражения a/b, где a и b целые числа необходимо преобразовать результат к типу float:
(float)a/b;
|