Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курс лекций по Программированию на С++.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
795.65 Кб
Скачать

Преобразования типов

Язык С++ достаточно свободно обращается с выражениями, включающими в себя различные типы данных. В С++ различают неявное преобразование типов и явное. Неявное преобразование типов в выражениях со смешанными типами данных осуществляется автоматически компилятором согласно иерархии типов данных, по которой у каждого типа данных имеется свой приоритет по отношению к другим типам. Приведём иерархию типов данных, перечислив основные типы по старшинству, от низшего к высшему: char  short  int  long int  float  double  long double. Таким образом, если в арифметическом выражении присутствуют операнды различного типа, то в этом случае операнд с более "низким" типом будет преобразован компилятором к более "высокому" типу. Рассмотрим пример:

#include <iostream>

#include <conio>

using namespace std;

int main() {

int i = 7;

float f = 1.5;

double d = i * f;

cout <<"Результат равен " << d << endl; // d=10.5

getch(); return 0;

}

При компиляции данной программы, тип int переменной i автоматически преобразовывается в вещественный тип, а затем результат умножения преобразовывается к типу double. Однако, необходимо помнить, что в ряде случаев (особенно при целочисленных вычислениях) могут возникать ошибки из-за того, что компилятор не осуществляет преобразования типов.

#include <iostream>

#include <conio>

using namespace std;

int main() {

int a = 5, b = 2;

a=a/b*10;

cout <<"Результат равен " << a << endl; // a=20 - ошибка. Должно быть 25

getch(); return 0;

}

Из-за того, что в данной программе происходит деление величин целого типа, возникает ситуация, когда получающаяся в результате деления дробная часть отбрасывается, из-за того, что эти величины определены как целые. В итоге мы получаем неправильный ответ 20, вместо 25. Для решения этой проблемы можно определить переменные a и b как float, а можно осуществить явное преобразование типов следующим образом.

int main() {

int a = 5, b = 2;

a = static_cast<float>(a) / b * 10.0; //преобразовываем переменную а к вещественному типу

cout <<"Результат равен " << a << endl; // a=25

getch();

return 0;

}

Здесь, с помощью оператора явного приведения типов static_cast<новый тип> (переменная) мы устранили ошибку. Наряду с таким способом приведения типов, существуют другие способы в стиле С: a = float(a) / b * 10.0; или a = (float)a / b * 10.0;. Недостаток последних двух форматов заключается в том, что их трудно найти в большом коде программы как визуально, так и с помощью команды поиска.

Арифметические операции

В языке С++ используются четыре основные арифметические операции: +, -, *, /. Их использование ничем не отличается от математики. Кроме этого, существует ещё одна арифметическая операция, которая применяется только к целым числам типа char, short int, int, long int. Эта операция называется операцией остатка от деления и обозначается знаком %. Результатом этой операции является остаток, получаемый при делении левого операнда на правый.

int main() {

cout <<6%8 <<endl //6 (нет такого числа, которое при умножении на 8 дало бы 6 => остаток 6)

<<7%8 <<endl //7

<<8%8 <<endl //0 (8*1=8, 8=8+0 => остаток 0)

<<11%4 <<endl //3 (4*2=8, 11=8+3 => остаток 3)

<<12%10 <<endl; //2 (10*1=10; 12 = 10+2 => остаток 2)

return 0;

}

В языке С++ часто используются так называемые арифметические операции с присваиванием (+=, -=, *=, /= и т.п.). Эти операции комбинируют арифметическую операцию и операцию присваивания, тем самым исключая необходимость использования имени переменной дважды.

Также часто применяются операции увеличения и уменьшения на 1. Эти операции, называемые также инкрементом (++) и декрементом (--), имеют две формы записи – префиксную, когда операция записывается перед операндом (++а) и постфиксную (а++). В префиксной форме сначала изменяется операнд, а затем его значение становится результирующим значением выражения, а в постфиксной форме значением выражения является исходное значение операнда, после чего он изменяется. Рассмотрим пример:

int main() {

int a = 27;

a += 10; // то же самое, что a = a + 10;

cout << a << ", ";

a -= 7; // то же самое, что a = a - 7;

cout << a << ", ";

a *=2; // то же самое, что a = a * 2;

cout << a << ", ";

a /= 3; // то же самое, что a = a / 3;

cout << a << ", ";

a %= 3; // то же самое, что a = a % 3;

cout << a << endl;

a++; cout << a << ", "; // то же самое, что a = a + 1;

a = 5 * (++a); cout << a << ", ";

a = 5 * (a++); cout << a << endl;

return 0;

}

Результат работы программы: 1 строка: 37, 30, 60, 20, 2 ; 2 строка: 3, 20, 101.