Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Текст_лекций_Си.doc
Скачиваний:
18
Добавлен:
16.03.2016
Размер:
1.06 Mб
Скачать

Глава 4 операции и выражения

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

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

Назначение любого выражения – формирование некоторого значения. В зависимости от типа формируемых значений определяются типы выражений.

Если значениями выражений являются целые или вещественные числа, то говорят об арифметических выражениях.

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

Выражения отношения и логические выражениятрадиционно должны давать одно значение: истина или ложь. В СИ истина – всегда ненулевое значение, 0 – ложь.

Отношение определяется как пара арифметических выражений, соединенных (разделенных) знаком операции отношения.

Операндами логических выражений являются выражения отношения.

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

Ранг

Операции

Ассоциативность

1

(); [];; .

2

!; ~; +; –; ++; ––; &; *; (тип); sizeof

3

*; /; % (мультипликативные бинарные)

4

+; – (аддитивные бинарные)

5

<<; >> (поразрядного сдвига)

6

<; <=; >=; > (отношения)

7

==; != (отношения)

8

& (поразрядная конъюнкция “И”)

9

^ (поразрядное исключающее “ИЛИ”)

10

| (поразрядная дизъюнкция “ИЛИ”)

11

&& (конъюнкция “И”)

12

|| (дизъюнкция “ИЛИ”)

13

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

14

=; *=; /=; %=; +=; –=; &=; ^=; |=; <<=; >>=

15

, (операция запятая)

За исключением операций “[]”, “()” и “?:” все знаки операций распознаются компилятором как отдельные лексемы. В зависимости от контекста одна и та же лексема может обозначать разные операции, т.е. один и тот же знак операции может употребляться в различных выражениях и по разному интерпретироваться в зависимости от контекста.

Например, бинарная операция & – это поразрядная конъюнкция, а унарная & – это операция получения адреса.

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

Операции ранга 1 имеют наивысший приоритет.

Операции одного ранга имеют одинаковый приоритет, и если их в выражении несколько, то они выполняются в соответствие с правилом ассоциативности либо слева направо (), либо справа налево (). Если один и тот же знак операции приведен в таблице дважды (например знак *), то первое появление (с меньшим по номеру, т.е. старшим по приоритету, рангом) соответствует унарной операции, а второе – бинарной.

    1. Унарные (одноместные) операции

Для изображения одноместных префиксных и постфиксных операций используются следующие символы:

& – операция получения адреса операнда. Нельзя &(x+1).

* – операция обращения по адресу, т.е. раскрытия ссылки, иначе операция разыменования (доступа по адресу к значению того объекта, на который указывает операнд). Оператором должен быть указатель.

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

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

~ – поразрядное инвертирование внутреннего двоичного кода целочисленного аргумента – побитовое отрицание.

Пример:

Unsigned char a:

A=201: (=c9 (16) = 11001001(2))

~A=54: (= 36 (16) = 00110110(2))

! – логическое отрицание (НЕ) значения операнда. Применяется к стандартным операндам. Целочисленный результат 0 (если операнд не нулевой, т.е. истинный) или 1 (если операнд нулевой, т.е. ложный). Напомним, что в качестве логических значений в языке используются целые числа: 0 – ложь и не нуль, т.е. (!0) – истина. Отрицание любого ненулевого числа будет 0, а отрицанием 0 будет 1. Таким образом: !1 равно 0; !2 равно 0; !(–5) равно 0; !0 равно 1;

++ – увеличение на единицу (инкремент или автоувеличение); имеет две формы:

++<имя> префиксная операция – увеличение значения операнда на 1 до его использования. Ассоциативность справа в соответствие со стандартом.

<имя>++ постфиксная операция – увеличение значения операнда на 1 после его использования. Ассоциативность слева в соответствие со стандартом.

  • выражение ++m увеличивает на 1 значение m, и это полученное значение используется как значение выражения ++m (префиксная форма).

  • выражение – – k уменьшает на 1 значение k, и это полученное значение используется как значение выражения – –k (префиксная форма).

  • выражение i++ (постфиксная форма) уменьшает на 1 значение i, однако значением выражения i++ будет предыдущее значение i (до его увеличения).

  • выражение j – – (постфиксная форма) уменьшает на 1 значение j, однако значением выражения j – – будет предыдущее значение j (до его уменьшения.

Например

int arg=4, rez;

rez= arg ++*2; // rez=8, arg=5

rez=++ arg *2; // arg=6, rez=12

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

X+++bилиz– – –d.

В этих случаях трактовка однозначно и полностью определяется рангами операций (бинарные аддитивные + имеют ранг 4;унарные ++ и –– имеют ранг 2).Таким образом:

x+++bэквивалентно (x++)+b

z– – –dэквивалентно (z– –)–d.

Операнд для операции ++ (и для операции – – ) не может быть константой либо произвольным выражением. Записи ++5 или 84++ будут неверными. ++(j+k) также неверная запись. Операндами унарных операций ++ и – – должны быть всегда модифицируемые выражения (L– value, left value, l – значение, леводопустимое выражение).

Термины «леводопустимое выражение» и «l–значение» происходят от объяснения действия операции присваивания E=D, в которой операнд Е слева от знака операции присваивания может быть только модифицируемым l – значением. Примером модифицируемого l – значения служит имя переменной, которой выделена память. L – значение – ссылка на область памяти, значение которой доступно изменениям.

Sizeof – операция вычисления размера (в байтах) для объекта того типа, который имеет операнд. Разрешается два формата операции:

sizeof <выражение>

sizeof (тип).

Пример:

int a, b[100], *x;

sizeof (20.0) 8 байтов

sizeof (a) 2байта

sizeof (b) 200байтов

sizeof (*x) 2байта

sizeof (int) 2байта

sizeof (date) 12байтов

    1. Бинарные (двуместные) операции

Делятся на следующие группы:

  • аддитивные;

  • мультипликативные;

  • сдвигов;

  • поразрядные;

  • операции отношений;

  • логические;

  • присваивания;

  • выбора компонента структурированного объекта;

  • операция “запятая”;

  • скобки в качестве операций;

Аддитивные операции (операнды: арифметические выражения или указатели).

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

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

Мультипликативные операции.

* – умножение операндов арифметического типа.

/ – деление операндов арифметического типа.

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

Например: 20/3 равно 6,

–20/3 равно –6,

(–20)/3 равно –6,

20/(–3) равно –6.

% – получение остатка от деления целочисленных операндов (деление по модулю). При неотрицательных операндах остаток положительный. В противном случае остаток определяется реализацией. В компиляторе Turbo С у результата знак делимого:

13%4 равняется 1,

(–13)%4 равняется –1;

13%(–4) равно +1,

(–13)%(–4) равняется –1.

При ненулевом делителе для целочисленных операндов всегда выполняется соотношение (a/b)*b+a%b равно а.

Чтобы результат выполнения арифметической операции был вещественным, необходимо, чтобы вещественным был хотя бы один из операндов. Например, значением выражения 5.0/2 будет 2.5, что соответствует смыслу обычного деления.

Операции сдвига (определены только для целочисленных операндов).

Формат

<операнд_левый> <операция_сдвига><операнд_правый>

<< – сдвиг влево битового представления значения левого целочисленного операнда на количество разрядов, равное значению правого целочисленного операнда.

>> – сдвиг вправо битового представления значения левого целочисленного операнда на количество разрядов, равное значению правого целочисленного операнда.

E1>>E2, Е2 – число битов сдвига.

Результат не определен, если: Е2<0; значение Е2 >= размера Е1 в битах.

E1>>E2 эквивалентно Е1 / (2E2)

E1<<E2 эквивалентно Е1 * 2E2

Пример:

4<<2 равняется 16. двоичный код для 4 равен 100,

5>>1 равняется 2. двоичный код для 5 – это 101.

При сдвиге влево на две позиции код 100 становится равным 10000 (десятичное значение равно 16). Остальные результаты операций сдвига могут быть прослежены аналогично.

Обратите внимание, что сдвиг влево на n позиций эквивалентен умножению значения на , а сдвиг кода вправо уменьшает соответствующее значение в раз с отбрасыванием дробной части результата (Поэтому 5>>1 равно 2).

Поразрядные операции.

& – поразрядная конъюнкция (И) битовых представлений значений целочисленных операндов.

| – поразрядная дизъюнкция (ИЛИ) битовых представлений значений целочисленных операндов.

^ – поразрядное исключающее ИЛИ битовых представлений целочисленных операндов.

А

В

А&B

A|B

F

F

T

F

F

F

T

T

F

T

T

F

F

F

T

T

T

F

T

T

Пример: Результат выполнения операций сдвига и поразрядных операций:

6&5 равняется 4.

6|5 равняется 7.

6^5 равняется 3.

Напоминаем, что двоичный код для 5 – это 101, для 6 – 110 и т.д.

Операции отношения (сравнения).

Операнды: арифметические выражения и указатели. Указатели можно сравнивать только с целым. Результат целочисленный: 0 (ложь) или 1 ( истина).

< меньше, чем.

> больше, чем.

<= меньше или равно.

>= больше или равно.

== равно.

!= не равно.

Последние две операции (операции сравнения на равенство) имеют более низкий приоритет по сравнению с остальными операциями отношений. Таким образом, выражение

( x<b = = a<x )

есть 1, тогда и только тогда, когда значение х находится в интервале от a до b и а<b (Вначале вычисляются x<b и x>a, а к результатам применяется операция сравнения на равенство ==).

Пример:

a+b<b+c = = a+c<a+b

x1<x2 = = x3<x1 есть 1 тогда и только тогда, когда х1 в интервале [x3;x2] и x3<x2.

Логические бинарные операции.

&& – конъюнкция (И) арифметических операндов или отношений. Целочисленный результат 0 (ложь) или 1 (истина). Если 1-й операнд равен 0, то 2-й не вычисляется.

|| – дизъюнкция (ИЛИ) арифметических операндов или отношений. Целочисленный результат 0 (ложь) или 1 (истина). Если 1-й операнд равен 1, то 2-й не вычисляется.

Пример:

3<5 равен 1.

      1. равен 0.

3==5 равен 0.

3!=5 равен 1.

3!=5 || 3==5 равен 1.

3+4>5 &&3+5>4 && 4+5>3 равен 1.

Задача 1. Написать условие попадания точки (x, y) в область.

  1. Точка в верхней полуплоскости: y  0.

  2. Точка в правой полуплоскости: x  0.

  3. Точка выше прямой: y  1-x

Все три условия должны выполняться одновременно:

y  0 && x  0 && y  1-x – с границами

Задача 2. Написать условие не попадания точки (x, y) в область.

  1. Попадание внутрь круга: x2 +y2  1.

  2. Точка в I и III квадрантах: xy  0.

Оба условия должны выполняться одновременно:

!( x*x+y*y<1 && x*y > 0 ) – без границ

Задача 3 Деление нацело, кратность: m%n == 0.