Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






тип) выражение






static_cast < тип> (выражение)

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

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

В этом примере переменная A имеет тип int, поэтому при выполнении операции деления A/5 мы получим целый результат. При присваивании полученного значения переменной x(тип float) выполняется преобразование целого значения в вещественное. Так как диапазоны значений типов int и float разные, может произойти потеря данных, и система выдает соответствующее сообщение. Во втором случае мы сначала преобразуем A в float, а уже затем выполняем деление, поэтому никаких сообщений нет.

Ошибка, которую вы видите на рисунке, возникла из-за того, что функция sqrt не может иметь аргумент типа int. Это видно во всплывающем окне (курсор мыши находится на названии функции), и об этом же сообщает система при выводе сообщения об ошибке. В тексте примера ошибка исправлена с помощью операции приведения типа.

Операции отношений

В С++ используются следующие операции отношений:

< – меньше;

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

> – больше;

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

== – равно;

! = – не равно.

Значением операций является true или false. Операнды могут иметь арифметический тип или быть указателями.

Будьте внимательны при использовании операций «=» и «==». Пусть, например, значение переменной А равно 2, а значение В равно 5. Результатом операции А=В будет значение 5, которое в большинстве версий языка интерпретируется как true (0 – ложь, не ноль – истина). Результатом А==В будет false.

Также с осторожностью нужно использовать операцию равно для сравнения вещественных чисел. Вместо С==D гораздо безопаснее использовать конструкцию abs(С-D)< =eps, где eps – достаточно маленькое число.

Из отношений и функций можно формировать более сложные выражения, используя логические операции:

& & – логическое «И»;

|| – логическое «ИЛИ»;

! – логическое отрицание.

Операндом логического выражения может быть также значение арифметического типа или указатель. Если операнд равен нулю, то в этом случае считается, что он имеет значение false, если не равен – значение true.

Результат операции «И» равен true, только если оба операнда имеют значение true. Результат операции «ИЛИ» имеет значение true, если хотя бы один из операндов имеет значение true. Логическое отрицание дает в результате значение 0, если операнд имел значение true, и 1 в противном случае.

В качестве примера логического выражения рассмотрим, как можно запрограммировать на С++ проверку условия :

((x> =a)& & (x< =b))||((x> =c)& & (x< =d))

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

Поразрядные операции (операции с битами) применяются только к целочисленным операндам, так как работают с их двоичными представлениями. Эти операции нельзя применять к переменным типа float и double. Определены следующие операции:

& – поразрядное «И» (результат равен 1 тогда и только тогда, когда оба операнда равны 1);

| – поразрядное «ИЛИ» (результат равен 1 тогда, когда хотя бы один из операндов равен 1);

~ – поразрядная инверсия (если операнд равен 0, то результат – 1, и наоборот);

^ – поразрядное «исключающее ИЛИ» (результат равен 1 тогда, когда только один из операндов равен 1);

< < – сдвиг влево;

> > – сдвиг вправо.

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

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

1. Так можно запрограммировать проверку на нечетность: (A& 1). Это выражение будет равно 1(true) для нечетных чисел и 0(false) – для четных. Такая проверка работает быстрее, чем (A%2==1), хотя в последнем случае достаточно было написать (A%2).

2. Флаги форматирования (пример 1.3) представляют собой отдельные биты специальной переменной типа long, поэтому для установки флага требуется записать 1 в соответствующий бит, а для сброса флага – удалить эту 1. Константы, которые вы задаете при установке или сбросе флага как раз и содержат 1 в нужном разряде. Если устанавливаются или сбрасываются несколько флагов, то константы объединяются с помощью поразрядной операции «ИЛИ» как в приведенном ниже операторе:

cout < < " B = " < < setiosflags(ios:: fixed | ios:: showpoint)

< < setw(10) < < B < < endl;

Операции инкремента и декремента

Операция инкремента (++) прибавляет к операнду единицу, а операция декремента (--) вычитает из операнда единицу. Рассмотрим основные случаи применения этих операций для операции ++ (для -- аналогично):

 

  Оператор Эквивалентные операторы
1. i++; i = i + 1;
2. j = i++; j = i; i++;
3. j = ++i; i++; j = i;

В случаях 1 и 2 оператор инкремента имеет постфиксную форму записи (операция записывается после операнда), в случае 3 – префиксную форму (операция записывается перед операндом). Значением выражения i++ является исходное значение i (до выполнения сложения), значением ++i является значение i после выполнения сложения. Операции инкремента и декремента позволяют получить более эффективный код программы

Пример 2.2. Использование операции инкремента

Рассмотрим, как вычисляется значение выражения A - B++. Приоритет ++ выше, чем приоритет -. Сначала вычисляется значение B++, которое равно 5, и значение B увеличивается на 1. Потом из значения А вычитается 5. В результате R=7-5=2. Значение A+++B вычисляется аналогично. Значение A++ равно 7, после чего А увеличивается на 1. R=7+6=13. При вычислении A-++B сначала вычисляется ++B (B увеличивается на 1, и значение выражения равно 7), а потом из А вычитается 7. R=8-7=1. Результаты работы программы вы видите на рисунке ниже.

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

Наряду с обычным присваиванием в С++ имеются сложные операции присваивания: *=, /=, +=, -=, %=, < < =, > > =, & =, ^=,! =. Смысл операций заключается в том, что вместо конструкции

Операнд1 = Операнд1 Операция Операнд2

используется конструкция

Операнд1 Операция = Операнд2

И дело не только в том, что получается более короткий текст программы. В первом случае нужно дважды вычислять адрес переменной Операнд1, а во втором – только один раз. Поэтому использование сложных операций присваивания ускоряет работу программы.

Все операции присваивания могут использоваться в программе как законченные операторы.

Задания для самостоятельной работы

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

1. Вычислить сумму цифр трехзначного числа.

2. Для введенного трехзначного числа вычислить число, у которого цифры идут в обратном порядке.

3. Определить номера подъезда и этажа по номеру квартиры пятиэтажного дома, считая, что на каждом этаже 4 квартиры.

4. Ввести координаты 2 точек: (x1, y1) и (x2, y2). Вычислите расстояние между этими точками.

5. Треугольник задан координатами своих вершин: (x1, y1), (x2, y2), (x3, y3). Найти периметр и площадь треугольника (2 способами). (Указания: для вычисления площади можно использовать формулу Герона S= , где p – полупериметр, a, b, c – длины сторон, или формулу, выражающую площадь через координаты вершин, S= ).

 






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.