Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование на языке с++ ч.1.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.13 Mб
Скачать

Лабораторная работа №6 Логические и поразрядные операции. Операции сравнения и определения размера

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

Теоретические сведения

Для формирования и последующего вычисления выражений в языке С++ используются операции. Знак операции воспринимается компилятором как отдельная лексема.

В языке С++ имеются следующие классы операций:

  • арифметические операции (аддитивные, мультипликативные, увеличения (increment) и уменьшения (decrement));

  • операции присваивания;

  • условие (тернарная операция);

  • логические операции;

  • операции сравнения (операции отношения, операции сравнения на равенство);

  • поразрядные (побитовые) операции (логические, операции сдвига).

Операция определения размера sizeof

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

sizeof выражение

sizeof (тип)

sizeof не вычисляет значения выражения, а только определяет его тип, для которого затем вычисляется размер.

Результат операции – целое число, равное количеству байтов, которое необходимо для хранения в памяти заданной величины.

При этом выражение должно иметь смысл с точки зрения выполнимости. Например, при компиляции возникает ошибка, если указать sizeof 5/0; в силу недопустимости деления на ноль.

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

Например:

sizeof f+a;

//количество байтов, занимаемых значением выражения

sizeof (long);

//количество байтов, занимаемых типом long

Условие (тернарная операция)

Операция

Результат

Ограничения

Примеры выражений

х? y: z

y, если х не равно 0;

z – иначе

float s = 1.234;

s > 2.15 ? 1: 0

(результат 0)

Логические операции

Операция

Результат

Ограничения

Примеры выражений

х && у

логическое И

1, если х и у не равны 0;

0 – иначе

результат типа int

3&&2 (результат =1)

3&&0 (результат =0)

х || у

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

0, если х и у равны 0;

1 – иначе

результат типа int

3 || 2 (результат =1)

3 || 0 (результат =1)

0 || 0 (результат =0)

логическое отрицание (НЕ)

1 – если х =0, иначе 0

результат типа int

!0 (результат =1)

!3 (результат =0)

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

Операция

Результат

Ограничения

Примеры выражений

Отношения

х < у

(x > y)

1, если х меньше (больше) у;

0 – иначе

результат типа int

3 < 2 (результат 0)

3 > 2 (результат 1)

х <= у

(x >=y)

1, если х меньше или равно (больше или равно) у;

0 – иначе

результат типа int

3 <= 2 (результат 0)

3 >= 2 (результат 1)

3 >= 3 (результат 1)

Сравнение на равенство

х == у

1, если х равно у;

0 – иначе

результат типа int

3 == 2 (результат 0)

3 == 3 (результат 1)

х != у

1, если х не равно у;

0 – иначе

результат типа int

3 != 3 (результат 0)

3 != 2 (результат 1)

Поразрядные операции (побитовые)

Операция

Результат

Ограничения

Примеры выражений

Логические

х & у

поразрядное логическое И

соответствующий разряд результата 1, если оба разряда х и у равны 1;

0 – иначе

х и у – целочисленные операнды типа char, short, int, long

char c = '\325'

(c=11010101)

c & 3 (3=00000011) ->

00000001

х | у

поразрядное логическое ИЛИ

соответствующий разряд результата 0, если оба разряда х и у равны 0;

1 – иначе

х и у – целочисленные операнды типа char, short, int, long

char c = '\325'

(c=11010101)

c | 3 (3=00000011) ->

11010111

х ^ y

поразрядное исключающее ИЛИ

соответствующий разряд результата 1, если оба разряда х и у различны;

0 – если совпадают

х и у – целочисленные операнды типа char, short, int, long

char c = '\325'

(c=11010101)

c ^ 3 (3=00000011) ->

11010110

~ х

дополнение до единицы

бит со значением 1 обращается в 0 и наоборот

х – операнд типа char, short, int, long

char c = '\325'

(c=11010101)

~ c -> 00101010

Сдвиг

х << у

сдвиг влево на у разрядов;

освобождающиеся младшие разряды заполняются нулями

у положительно и меньше разрядности машины

char c = '\325'

(c=11010101)

c << 3 -> 10101000

х >> у

сдвиг вправо на у разрядов;

освобождающиеся старшие разряды заполняются нулями для переменных типа unsigned или значением старшего (знакового) бита

у положительно и меньше разрядности машины

char c = '\325'

(c=11010101)

c >> 3 -> 11111010

Пример 1.

/*Программа демонстрирует работу с логическими и поразрядными операциями, операциями сравнения и определения размера*/

#include <stdio.h>

void main(){

int a=4, b=2, c=0, log_i, log_ili, log_ne,

bit_i, bit_ili, bit_il, bit_dop, bit_s,

sr_o, sr_op, sr_r, k1, k2, k3;

char s='\325';

printf("a=%d, b=%d, c=%d\n\n",a,b,c);

/*Логические операции*/

log_i=a&&b; /*Логическое И*/

printf("a&&b=%d\n",log_i);

log_i=a&&c; /*Логическое И*/

printf("a&&c=%d\n",log_i);

log_ili=a||b; /*Логическое ИЛИ*/

printf("\ta||b=%d\n",log_ili);

log_ili=a||c; /*Логическое ИЛИ*/

printf("\ta||c=%d\n",log_ili);

log_ili=0||c; /*Логическое ИЛИ*/

printf("\t0||c=%d\n",log_ili);

log_ne=!c; /*Логическое НЕ*/

printf("!c=%d\n",log_ne);

log_ne=!a; /*Логическое НЕ*/

printf("!a=%d\n\n",log_ne);

/*Поразрядные (побитовые) операции*/

//вывод происходит в шестнадцатеричной системе счисления

bit_i=s&3; /*поразрядное логическое И*/

printf("\ts&3=%x\n",bit_i);

bit_ili=s|3; /*поразрядное логическое ИЛИ*/

printf("\ts|3=%x\n",bit_ili);

bit_il=s^3; /*поразрядное исключающее ИЛИ*/

printf("\ts^3=%x\n",bit_il);

bit_dop=~s; /*дополнение до единицы*/

printf("\t~s=%x\n",bit_dop);

bit_s=s<<3; /*поразрядный сдвиг влево*/

printf("s<<3=%x\n",bit_s);

bit_s=s>>3; /*поразрядный сдвиг вправо*/

printf("s>>3=%x\n\n",bit_s);

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

sr_o=a<b; /*а меньше b*/

printf("\ta<b=%d\n",sr_o);

sr_o=a>b; /*а больше b*/

printf("\ta>b=%d\n",sr_o);

sr_op=a<=b; /*а меньше или равно b*/

printf("a<=b=%d\n",sr_op);

sr_op=a>=b; /*а больше или равно b*/

printf("a>=b=%d\n",sr_op);

sr_op=a>=4; /*а больше или равно b*/

printf("a>=4=%d\n",sr_op);

sr_r=a==b; /*a равно b*/

printf("\ta==b=%d\n",sr_r);

sr_r=a==4; /*а равно 4*/

printf("\ta==4=%d\n",sr_r);

sr_r=a!=4; /*а не равно 4*/

printf("\ta!=4=%d\n",sr_r);

sr_r=a!=b; /*а не равно b*/

printf("\ta!=b=%d\n\n",sr_r);

/*Операция определения размера памяти (в байтах)*/

k1=sizeof(int);

/*число байтов, отводимое для объектов типа int*/

printf("sizeof(int)=%d\n",k1);

k2=sizeof(float);

/*число байтов, отводимое для объектов типа float*/

printf("sizeof(float)=%d\n",k2);

k3=sizeof 2*a; /*число байтов, отводимое для хранения

результата умножения 2*а*/

printf("sizeof 2*a =%d\n",k3);

}

Задания

  1. Наберите код программы из Примера 1. Сохраните код в файл с именем log_srav.cpp. Выполните компиляцию и запуск программы.

  2. Написать программу. Записать выражение, зависящее от координат точки x1 и y1, принимающее значение 1, если точка принадлежит заштрихованной области, и 0, если не принадлежит.

  1. Напишите программы для вычисления следующих выражений и выведите в результате значения переменных a, b и j на экран. Полученные результаты обосновать в комментариях.

  1. int j, b = 5, a =4;

j = b---a;

  1. int j, b = 5, a =4;

j = (b--)-a;

  1. int j, b = 5, a =4;

j = b-(--a);

Домашние задания

  1. Напишите программы для вычисления следующих выражений и выведите в результате значения переменных a, b и j на экран. Полученные результаты обосновать в комментариях.

  1. int j, b=5, a=4; j = --b-a--;

  1. int j, b=5, a=4; j = -a++-++b;

  1. int j, b=5, a=4; j = a-++b;

  1. Индивидуальное задание. Номер варианта определяется по журналу. Написать программу. Записать выражение, зависящее от координат точки x1 и y1, принимающее значение 1, если точка принадлежит заштрихованной области, и 0, если не принадлежит.

Варианты индивидуального задания

Задание

Задание