Int main ()//начало(заголовок) обязательной главной функции



ПРЕОБРАЗОВАНИЕ (ПРИВЕДЕНИЕ) ТИПОВ

 

Результат вычисления выражения характеризуется значением и типом. Если операнды в выражении имеют одинаковый тип, то результат операции будет иметь тот же тип. Однако, в выражение могут входить операнды и различных типов. Но для того, чтобы компилятор мог вычислить выражение, операнды должны быть одинакового типа, поэтому перед вычислением выражения компилятор модифицирует операнды так, чтобы они были одного и того же типа, но (важно!) сохранили свое значение. То есть перед вычислениями выполняются преобразования (приведения) типов по определенным правилам, обеспечивающим преобразования более коротких типов в более длинные для сохранения значимости и точности. Если программист не указывает компилятору явно, как ему делать преобразования, то компилятор в ходе вычисления делает преобразования сам, т.е. осуществляет неявное преобразование типов. Сначала компилятор разбивает выражение на подвыражения и приводит все операнды к старшему используемому в подвыражении типу, а затем вычисляется значение подвыражения, далее по такому же правилу из подвыражений вычисляется значение всего выражения.

Например, если определены следующие объекты:

int nA 1 = 2, nA 2 = 5.5; // значение nA2 равно 5, так как произошло неявное

        // преобразование константы 5.5 типа float к типу int при выполнении операции =

float fltB = 3;

Выражение nA1 + 2 - nA2 будет иметь значение -1, тип которого int (все операнды в выражении типа int).

Выражение fltB = nA 1+ 2 - nA 2 будет иметь то же значение -1., но тип его будет float, так как при выполнении оператора = произошло неявное преобразование внутреннего представления информации в объекте fltB .

Выражение nA1 + 2.2 - nA2 будет иметь значение 0.8, тип которого float (один из операндов константа 2.2 имеет тип float, следовательно, все операнды в выражении преобразованы к более длинному типу  float).

Выражение nA 2 = nA 1+ 2.2 - nA 2 будет иметь значение 0, тип его будет int, так как при выполнении оператора = произошло неявное преобразование значения 0.8, вычисленного в выражении nA 1 + 2.2 - nA 2 и имеющего значение float к типу int.

 Полученное в результате вычисления выражения значение приводится к типу слева от знака присваивания. В этом случае может возникнуть ситуация преобразования старшего типа к младшему (если слева от знака равенства стоит переменная младшего, чем все выражения типа) и, соответственно, потеря точности, или даже возникновение грубой ошибки, если значение старшего типа не помещается в разрядную сетку младшего.

Для того, чтобы не получать странные результаты и не потерять точность при вычислении выражений, программист должен знать правила, по которым компилятор осуществляет неявные преобразования. И, если действия компилятора не соответствуют замыслу программиста, необходимо использовать явные преобразования типов, при которых вся ответственность за результат ложится на программиста. Однако, не рекомендуется без оправданной необходимости (особенно начинающим программистам) пользоваться явным преобразованием типа (Б. Страуструп). Необходимость возникает, например, когда без явного приведения типа теряется точность вычисления выражения или в смешанных выражениях, операндами которых являются объекты как стандартных, так и пользовательских типов. Компилятор не сможет автоматически неявно преобразовывать пользовательские типы данных, как он это делает со стандартными типами. Явные преобразования в стиле Си:

int x=1,y=2;

double z =( double ) x / y ; /* явное указание компилятору

 привести значение целой переменной x к типу double */

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

Явные преобразования в стиле Си стали нежелательны после введения операторов приведения в новом стиле в С++, поэтому сейчас там, где необходимо явное преобразование, рекомендуется пользоваться новыми операторами вида static_cast< type >(выражение). Запишем оператор из предыдущего примера с явным преобразованием типа в новом стиле Си++:

double z = static_cast <double >(x)/y;

Использование нового оператора static_cast предпочтительнее старого оператора явного преобразования, т.к. при этом компилятор следит не только за возможностью, но и за безопасностью приведения типа. И если с точки зрения компилятора приведение небезопасно, он выдает ошибку. Таким образом, повышается надежность программного обеспечения.

Для использования в арифметических выражениях математических функций в проект должна быть включена библиотека (заголовочный файл) cmath. Это включение производится с помощью директивы препроцессора  #include <cmath>. Некоторые из доступных после этого функций приведены в нижеследующей таблице 5 (слайд 26).

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

 

Средства ввода–вывода данных в С++

Пример простейшей программы ввода и вывода целого числа:

//Программа для ввода пользователем целого числа

// и отображения числа на экране

#include <iostream> // директива препроцессора для системы ввода-вывода

using namespace std; // простраество имен стандартной библиотеки С++    

int main ()//начало(заголовок) обязательной главной функции

{            // начало блока (тела главной функции)         

setlocale(LC_ALL,"rus"); //установки для кириллицы в консольном окне


Дата добавления: 2020-11-27; просмотров: 80; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!