Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
DOROGOVA.pdf
Скачиваний:
245
Добавлен:
05.06.2015
Размер:
853.4 Кб
Скачать

Выражение С=N&0377 передает в переменную С младший байт (8 битов) переменной N, обнуляя все остальные разряды. Двоичное представление константы 0377 будет выглядеть следующим образом:

… 000 000 011 111 111, здесь наглядно видно, что "помечен" младший байт переменной.

В следующем примере переменные инициализируются шестнадцатеричными константами (в комментариях даны соответствующие двоичные представления).

Результат формируется отдельно для каждого бита переменной r, используя в качестве операндов соответствующие биты переменных i и j, согласно таблице истинности логических операций "ИЛИ-НЕ", "И", "ИЛИ".

Например, для r = i^j нулевой бит r равен 0, так как 1^1 равно 0.

Пример: Вспомним, что тип константы определяется по её внешнему виду, если константа начинаются с нуля, то это восьмеричная константа, если же с 0Х (или 0x), то шестнадцатеричная.

int i=0x47F0; /*

i

=

0100 0111 1111 0000*/

j=0xA0FF;

j

=

1010 0000 1111 1111*/

char r;

 

 

 

 

r = i^j;

/* r=0xE70F

=

1110 0111 0000 1111*/

r = i|j;

/* r=0xE7FF

=

1110 0111 1111 1111*/

r = i&j

/* r=0x00F0

=

0000 0000 1111 0000*/

3.8. Операции сдвига

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

Существуют две операции сдвига:

<< – сдвиг влево; >> – сдвиг вправо.

При сдвиге влево правые освобождающиеся биты устанавливаются в нуль.

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

Например, Х << 2 сдвигает переменную Х влево на 2 разряда (бита), заполняя освобождающиеся биты нулями, что эквивалентно умножению на 4. Сдвиг вправо переменной unsigned на n битов эквивалентен целочисленному делению левого операнда на 2 в степени n.

Например 5 << 3 дает 40, а 7 >> 2 дает 1.

Пример: int i;

i << 1; // сдвиг влево на 1 бит (умножение i на 2) i >> 2; // сдвиг вправо на 2 бита (деление i на 4)

Отметим, что правый операнд должен быть константным выражением. Если правый операнд отрицателен, а также больше или равен числу битов левого операнда, то результат сдвига не определен.

Типом результата операции сдвига является тип левого операнда.

3.9. Операция sizeof

Унарная операция sizeof() вычисляет размер памяти занимаемой операндом и имеет следующий формат:

sizeof (выражение)

В качестве выражения может быть использован любой идентификатор, либо имя тип, а операндом sizeof() может быть только объект, расположенный в памяти компьютера.

Например, нельзя использовать тип void (так как не существует данных этого типа), также идентификатор не может быть именем битового поля или функции.

Пример:

 

 

int i,j,k,n=15;

 

 

double x;

 

 

i = sizeof(n);

//i=4 j = sizeof(int);

// j=4

k = sizeof(double)

// k=8

 

Чаще всего оператор sizeof() используется для определения размеров пользовательских типов данных, например для определения размера массива или элемента структуры.

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

3.10. Операция следования

Символом операции следования является "," (запятая). Выражения, разделенные этим символом, выполняются слева направо строго в том порядке, в котором они перечислены. Результатом операции является результат последнего выражения. Поскольку запятая может использоваться и в качестве разделителя, важно не путать эти два её назначения.

Пример:

//в первой строке запятая это разделитель, а не операция; int a=3, b=8, c;

//две последующих строки содержат операцию следования c=k++, k+b;

(b--,c)*=3;

Первую операцию следования можно заменить следующей последовательностью команд: c=k++; c=k+b; в результате чего получим с=12.

Вторую операцию следования можно заменить последовательностью команд: b--; c *= 3; , в результате получим b=7, с=36.

Вкачестве разделителя запятая может применяться в следующих случаях:

В функциях для разделения аргументов, если их более одного. Например, f1(x,y).

При объявлении переменных, например, int q,w,e.

В качестве операции запятая часто используется в операторе for. Примеры будут приведены в соответствующем разделе пособия.

3.11. Сводная таблица операций языка С

Операции приведены в таблице 3.3. в порядке уменьшения приоритета, то есть имеют самый высокий ранг и выполняются, а первую очередь операции ( ) [ ] . и - >.

В последнюю очередь выполняются операции "присваивание" и "запятая".

Таблица 3.3

Знак

Название

Ранг

Порядок

Операции

Операции

Операции

выполнения

( )

Вызов

 

 

 

функции

1

 

[ ]

Индексная

 

Слева

 

направо

 

 

 

. и - >

Выбор элемента

 

 

-

Отрицание

 

 

 

арифметическое

 

 

!

Отрицание

 

 

 

логическое

2

 

~

Двоичное

 

 

 

*

дополнение

 

 

 

Косвенная

 

 

 

адресация

 

Слева

&

Вычисление адреса

 

направо

 

 

 

++

Инкремент

 

 

Декремент

 

 

- -

 

 

Приведение типа

 

 

(тип)

 

 

Вычисление

 

 

 

 

 

sizeof

размера

 

 

*

Умножение

 

Слева

 

 

3

направо

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

/

Деление

 

 

%

Остаток от деления

 

 

+

Сложение

4

Слева

 

 

-

Вычитание

направо

 

 

 

>>

Сдвиг вправо

5

Слева

 

 

<<

Сдвиг влево

направо

 

 

 

>

Больше

6

 

<

Меньше

6

 

> =

Больше или равно

6

 

< =

Меньше или равно

6

Слева

направо

 

 

 

= =

Равно

7

 

! =

Не равно

7

 

&

Поразрядное И

8

 

 

Поразрядное

 

 

^

исключающее ИЛИ

9

Справа

 

 

 

|

Поразрядное ИЛИ

10

налево

 

 

 

&&

Логическое И

11

Справа

 

 

 

|

Логическое ИЛИ

12

налево

 

?:

Условная

13

Справа

 

 

 

налево

=

Присваивание

14

Справа

 

 

 

налево

* =

 

 

 

/ =

 

 

 

% =

Составное

14

 

+ =

присваивание

 

 

- =

 

 

Справа

& =

 

 

налево

? =

 

 

 

> > =

 

 

 

< < =

 

 

 

^=

 

 

 

,

Последовательное

15

Справа

 

вычисление

 

налево

Естественный порядок выполнения выражений может быть изменен с помощью круглых скобок. Например, выражение:

6*r + k/s интерпретируется как (6 *r) + (k/s), но можно изменить этот порядок, поставив скобки:

6 * (r+k)/s.

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Вопросы для самопроверки

1.Поясните термин "унарная" (бинарная) операция.

2.Какие группы операций вы знаете?

3.Что такое ранг операции?

4.Какие выражения могут стоять слева от операции присваивания?

5.Какие выражения не могут стоять слева от операции присваивания?

6.Перечислите пять арифметических операций языка Си.

7.Приведите алгоритм работы счетчика, для чего он используется?

8.Что общего и какая разница между счетчиком и аккумулятором.

9.Какая разница между префиксной и постфиксной формой операции инкремента (декремента).

10.Изложите главное правило неявного преобразования типов при вычислении арифметических выражений.

11.Почему условную операцию называют тернарной?

12.Перечислите операции отношения.

13.Перечислите логические операции.

14.Для чего нужны логические операции?

15.Перечислите поразрядные операции. Для чего они используются?

16.Приведите пример использования операции sizeof.

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]