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

Строго говоря, в выражениях лучше использовать операнды одного типа. Но язык С++ допускает преобразование типов, т. e. если операнды оператора принадлежат к разным типам, то они приводятся к некоторому общему типу. Приведение выполняется в соответствии со следующими правилами:

1) автоматически производятся лишь те преобразования, которые превращают операнды с меньшим диапазоном значений в операнды с большим диапазоном значений, поскольку это происходит без какой-либо потери информации, например:

int i_var;

float f_var,summa;

i_var=5;f_var=2.5; summa=i_var+f_var;

2) выражения, не имеющие смысла (например, число с плавающей точкой в роли индекса), не пропускаются компилятором еще на этапе трансляции:

float f; mas [f]=25; // вызывает ошибку трансляции

3) выражения, в которых могла бы теряться информация (например, при присваивании длинных целых более коротким или действительных целым), могут вызвать предупреждение (warning), но они допустимы:

int i; float f; f=3.2;i=f;

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

Конструкция вида (имя типа) Выражение

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

Например: (int)i=2.5*3.2;

Лекция №3. ЛИНЕЙНЫЕ АЛГОРИТМЫ ПРОГРАММ

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

Линейными называются программы, в которых операторы выполняются один за другим с первого до последнего, не повторяясь и не изменяя порядка их выполнения.

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

Основные математические функции, используемые в языке С, представлены в табл. 3.1.Редкая программа обходится без операций ввода/вывода. Язык С++ имеет большой набор функций, осуществляющих ввод и вывод данных различных типов. Наиболее часто используются две из них: printf, scanf, которые предназначены для реализации форматного вывода и ввода данных.

Таблица 3.1. Основные математические функции

Наименование функции Обозначение функции Тип Имя файла описания
возвращаемого значения функции аргумента
Абсолютное значение abs(x) cabs(x) fabs(x) int double float int double float <stdlib.h> <math.h> <math.h>
Арккосинус acos(x) double double <math.h>
Арксинус asin(x) double double <math.h>
Арктангенс atan(x) double double <math.h>
Косинус cos(x) double double <math.h>
Синус sin(x) double double <math.h>
Экспонента ех ехр(х) double double <math.h>
Степенная функция ху pow(x,y) double double <math.h>
Логарифм натуральный log(x) double double <math.h>
Логарифм десятичный logl0(x) double double <math.h>
Корень квадратный sqrt(x) double double <math.h>
Тангенс tan(x) double double <math.h>

Функция printf имеет следующий синтаксис:

printf ("управляющая_строка", [список_аргументов]);

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

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

· знак "минус", указывающий на то, что выводимый текст выравнивается по левому краю, по умолчанию выравнивание происходит по правому краю;

· строка цифр, задающая минимальный размер поля вывода;

· точка, являющаяся разделителем;

· строка цифр, задающая точность вывода;

· символ l, указывающий на то, что соответствующий аргумент имеет тип long.

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

d - аргумент преобразуется в десятичное представление;

о - аргумент преобразуется в восьмеричное представление;

x - аргумент преобразуется в шестнадцатеричное представление;

с - значением аргумента является символ;

s - значением аргумента является строка символов;

e - значением аргумента является величина типа float или double в форме с плавающей точкой;

f - значением аргумента является величина типа float или double в форме с фиксированной точкой;

g - один из форматов f или e;

u - значением аргумента является целое беззнаковое число;

p - значением аргумента является указатель (адрес).

Таким образом, "управляющая_строка" определяет количество и тип аргументов. Наиболее часто используются следующие управляющие символы:

\a - кратковременный звуковой сигнал;

\n - перевод строки;

\t - горизонтальная табуляция;

\b - возврат курсора на один шаг назад;

\r - возврат каретки.

Функция scanf описывается так же, как и функция printf:

scanf ("управляющая_строка", список_аргументов);

Аргументы scanf() должны быть указателями на соответствующие значения, для этого перед именем переменной записывается символ &. Управляющая строка содержит спецификации преобразования и используется для установления количества и типов аргументов, аналогично функции printf.

Например: printf("i=%d,\nj=%d, a=%6.2f\n,i,j,a);

Если i=1234, j=127, a=86.531, то на экране увидим:

i=1234, так как после печати i стоит символ перевода строки \n

j=127, a=86.53.

Например: scanf ("%d %f %c %s", &i,&a,&ch,r);

Здесь r - строка символов, которая сама является указателем, поэтому перед ней знак амперсанта & не ставится.

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

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