Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
л_4_Операции_и_выражения.doc
Скачиваний:
10
Добавлен:
05.11.2018
Размер:
660.99 Кб
Скачать

Операции поразрядного сдвига

операция

содержание

>>

сдвиг вправо операнда слева от знака операции на число двоичных разрядов справа от знака операции; выдвигаемые биты теряются, а «вдвигаются» нулевые биты; арифметический или логический (зн. 0 )

<<

сдвиг влево операнда слева от знака операции на число двоичных разрядов справа от знака операции; выдвигаемые биты теряются, а «вдвигаются» нулевые биты; арифметический или логический (зн.  0)

Сдвиг операндов влево на 1, 2, 3 и более разрядов – наиболее быстрый способ умножения на 2, 4, 8, … Сдвиг операндов вправо на 1, 2, 3 и более разрядов – наиболее быстрый способ деления на 2, 4, 8, …

Пример 1.

2 << 7 = 256, так как:

210 = 00000000 000000102 (для типа unsigned short)

сдвиг влево на 7 разрядов этого числа дает перенос 1 на 7 разрядов влево:

00000001 000000002 = 1 * 28 = 256;

Пример 2.

256 >> 6 = 4, так как:

25610 = 00000001 000000002 (для типа unsigned short)

сдвиг вправо на 6 разрядов этого числа дает перенос 1 на 6 разрядов вправо:

00000000 000001002 = 410;

Что напечатает программа:

#define PRINT(int) printf(“int=%d\n”, int)

int x, y, z);

x=1; y=-1;

PRINT(!x | x);

(0000 | 0001) = 0001=1

PRINT(~x | x);

(1110 | 0001) = 1111= -1

PRINT(x ^ x);

(0001 ^ 0001) = 0000 = 0

x <<= 3; PRINT(x);

0001  1000 = 8

y <<= 3; PRINT(y);

1…111  1…1000  (-1) = 11…10111  10…01000 = - 8

y >>= 3; PRINT(y);

111111110001111116+8+4+2+1=31

1111111111111111 ???????

int sx=-8;

unsigned ux = -8;

printf (”sx=%o\n”, sx); // 177770

printf (”ux=%o\n”, ux); // 177770

printf (”sx>>3=%o\n”, sx>>3); // 177777 или 017777

printf (”ux>>3=%o\n”, ux>>3); // 017777

printf (”sx>>3=%d\n”, sx>>3); // -1 или 8191

printf (”ux>>3=%d\n”, ux>>3); // 0177778 = 1FFF= 8191

Дополнительные операции Операции доступа к компонентам структурированного объекта

Операции (. и ->) используются для выделения элемента структуры, объединения, класса.

Операция . выполняет прямой доступ к компонентам структурированного объекта. Формат применения операции:

имя_объекта.имя_компонента

Операция -> выполняет косвенный доступ к компонентам структурированного объекта, адресуемого указателем. При использовании операции требуется, чтобы с объектом был связан указатель. Формат применения операции:

указатель_на_объект->имя_компонента

Операции доступа к адресуемым компонентам классов

Операция .* – это прямое обращение к компоненту класса по имени объекта и указателю на компонент. Формат применения операции:

имя_объекта.*указатель_на_компонент

Операция ->* – это косвенное обращение к компоненту класса через указатель на объект и указатель на компонент. Формат применения операции:

указатель_на_объект->*указатель_на _компонент

Бинарная форма операции указания области видимости :: применяется для отнесения имени к конкретному пространству имен. Формат применения операции:

квалификатор_имени::имя

Квалификатором может служить имя класса или название (имя) пространства имен.

Тернарная операция (операция условия) выражение1 ? выражение2 : выражение3 если выражение1 >0 то выражение 2 иначе выражение3

(a>b) ? a=2 : b=2;

cout << ((a>b) ? a=2 : b=2) << endl;

d = (c>=0) ? c : -c;

Это единственная трехместная операция. В каждой из ветвей операции можно записать по одному выражению (соответствует оператору if, в котором в каждой ветви по одному оператору.

Например, условный оператор для преобразования прописной буквы в строчную:

if (‘A’ <= c && c <= ‘Z’) printf (“%c”, ‘a’+c-‘A’); else printf (“%c”, c);

можно заменить тернарной условной операцией:

printf (“%c”, (‘A’ <= c && c <= ‘Z’) ? (‘a’+c -‘A’) : c);

Тернарная операция не обязательно должна быть единственной в выражении. Например: R = A + (x > y ? x : y ) * B;

!!!Не для любого оператора if можно записать тернарную операцию. Она заменяет только полную форму.

Что напечатает программа:

#define PRINT(int) printf (“int = %d\n”, int)

int x=1, y=1, z=1;

x += y += z;

y=y+z= 2; x =x+y=3

PRINT(x < y ? y :x);

3 < 2  ложь  x=3

PRINT(x < y ? x++: y++);

3 < 2  ложь  2, а потом y=3

PRINT(x );

3

PRINT(y);

3

PRINT(z += x < y ? x++ : y++);

(z+=(3<3 ложь 3)  1+3=4, y=4

PRINT(y );

4

PRINT(z);

4

x=3; y = z =4;

PRINT(z >= y >= x) ? 1: 0);

((4>=4) >=3)  (1>=3) ложь 0

PRINT((z >= y )&& (y >= x ));

((4>=4) && (4>=3)) истина(1)