Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ПРОГРАММИРОВАНИЕ_Задание_для_контр_раб 2015_16.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.15 Mб
Скачать

Операции и выражения

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

Операции делятся на унарные, которые выполняются над одним операндом, и бинарные – над двумя операндами.

Унарные операции:

&

операция получения адреса операнда;

‘*’

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

‘-‘

унарный минус, изменяет знак арифметического операнда;

+

унарный плюс, введен для симметрии с унарным минусом;

~

инвертирует значение каждого бита операнда;

!

НЕ – логическое отрицание операнда;

++

увеличение на 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

Результат операций

!

&&

||

0

0

1

0

0

0

1

1

0

1

1

0

0

0

1

1

1

0

1

1

Операции присваивания

=

Простое присваивание: присвоить значение выражения-операнда из правой части операнду левой части. 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;