Преобразования типов
Выражения
Любая комбинация переменных, констант и операций, приводящая к вычислению некоторого значения, называется выражением. Например, выражениями являются конструкции alpha+12 или (alpha-37)*beta/2. Результатом выполнения всех операций, входящих в состав выражения, является значение. Так, например, если alpha будет равно 7, то значение первого выражения будет равно 19.
Выражения сами могут входить в состав других выражений. Во втором примере alpha-37 и beta/2 являются выражениями. Фактически каждую переменную и константу, например alpha и 37, можно считать частным случаем выражения.
Обратите внимание, что выражения и операторы — это не одно и то же. Операторы являются указанием компьютеру совершить какое-либо действие и всегда завершаются точкой с запятой (;). Выражения же лишь определяют некоторую совокупность вычислений. В одном операторе могут присутствовать несколько выражений.
Манипуляторы — это особые операции, которые используются вместе с операцией вставки << для того, чтобы видоизменять вывод, который делает программа. Мы знаем endl, познакомимся с setw.
setw изменяет ширину поля вывода.
Можно рассматривать каждую переменную, выводимую с помощью объекта setw, как занимающую некоторое поле — воображаемое пространство с определенной длиной. По умолчанию такое поле имеет достаточный размер для того, чтобы хранить нужную переменную. Так, например, цел т число 567 займет размер в 3 символа, а текстовая строка "раjаmаs" — 7 символов. Разумеется, существуют ситуации, когда подобный механизм не является ' лобным. Приведем пример программы WIDTH1, печатающей названия городов и численность их населения в виде двух столбцов:
Заголовочный файл <IOMANIP> для использования setw
//widthl. cpp
//демонстрирует необходимость применения манипулятора setw
#include <iostream>
using namespace std:
int main()
{
long popl = 4789426, pop2 = 274124, рорЗ = 9761;
cout « "Город " « "Нас." « endl «"Москва " « popl «endl «"Киров " « pop2 «endl «"Угрюмовка " «рорЗ «endl;
return 0;
}
Вывод программы будет выглядеть следующим образом:
Город Нас.
Москва 4789426
Киров 274124
Угрюмовка 9761
Программа с применением setw


Выравнивание по правому краю

Каскадирование операции <<
Обратите внимание на то, что в программах WIDTH1 и WIDTH2 имеется только один оператор с cout, несмотря на то, что он расположен на нескольких строчках. Записывая этот оператор подобным образом, мы прибегаем к свойству компилятора игнорировать разделительные символы. Таким образом, мы каскадируем операцию вставки, то есть записываем в одном операторе то, что можно было бы реализовать с помощью четырех последовательных операторов, начинающихся с cout.
Файл заголовка IOMANIP
Объявления манипуляторов (за исключением endl) происходит не в файле IOSTREAM, а в другом заголовочном файле — IOMANIP. Когда возникнет необходимость использовать эти манипуляторы, придется включить этот файл с помощью директивы #include, как мы делали в программе WIDTH2.
Пару слов о беззнаковых типах
Программа умножает обе переменные на 2, а затем делит на 3. Несмотря на то, что правильный результат должен получиться меньше исходного значения, промежуточное вычисление приводит к результату, большему, чем исходное число. Такая ситуация стандартна, но зачастую она приводит к ошибкам.
unsigned char ucharVar;
Выход за рамки допустимых для данного типа значений, как правило, приводит к труднообнаруживаемым ошибкам. Подобные ошибки с беззнаковыми типами происходят гораздо реже. Следующая программа хранит одно и то же значение, равное 1 500 000 000, в переменных signedVar типа int и unsignVar типа
unsigned int.
ПРИМЕР1.
// работа со знаковыми / беззнаковыми переменными
#include "stdafx. h"
#include <iostream>
using namespace std;
int main()
{
setlocale(LC_ALL,"Russian");
int signedVar = 15000000000; // знаковая переменная
unsigned int unsignVar = 15000000000; // беззнаковая переменная
signedVar = (signedVar * 2) / 3; // выход за границы диапазона
unsignVar = (unsignVar * 2) / 3; // вычисления внутри диапазона
cout << "Знаковая переменная равна " << signedVar << endl; // ошибка
cout << "Беззнаковая переменная равна " << unsignVar << endl; // правильно
system("pause");
return 0;
}
Явные преобразования типов
Явные преобразования типов, в отличие от неявных, совершаются самим программистом. Явные преобразования необходимы в тех случаях, когда компилятор не может безошибочно преобразовать типы автоматически.
Вот пример оператора, осуществляющего преобразование типа int к типу char:
aCharVar = static_cast<char>(anIntVar);
Здесь переменная, тип которой мы хотим изменить, заключена в круглые скобки, а тип, к которому мы приводим переменную, — в угловые скобки. Приведение типа переменной anIntVar происходит перед присваиванием значения переменной aCharVar.
ПРИМЕР2.
// работа со знаковыми и беззнаковыми переменными
#include <iostream>
using namespace std;
int main()
{
int intVar = 1500000000; // 1 500 000 000
intVar = (intVar * 10) / 10; // слишком большой результат
cout << "Значение intVar равно " << intVar << endl; // неверный результат
intVar = 1500000000;
intVar = (static_cast<double>(intVar) * 10) / 10; // приведение к типу double
cout << "Значение intVar равно " << intVar << endl; // верный результат
return 0;
}
ПРИМЕР
int ans = 10; , a=5;
ans += 10; // то же самое, что ans = ans + 10;
cout << ans << ", ";
ans -= 7; // то же самое, что ans = ans - 7;
cout << ans << ", ";
ans *= 2; // то же самое, что ans = ans * 2;
cout << ans << ", ";
ans /= 3; // то же самое, что ans = ans / 3;
cout << ans << ", ";
ans %= 3; // то же самое, что ans = ans % 3;
ans *= ++a;
cout << ans << endl;
20, 13, 26, 8, 2 , 12 //В данном случае первым выполняется инкрементирование.
Инкремент
Операция, которую мы сейчас рассмотрим, является более специфичной, нежели предыдущие. При программировании вам часто приходится иметь дело с увеличением какой-либо величины на единицу. Это можно сделать «в лоб», используя
оператор
a = a + 1; или a += 1; или ++a; // увеличение count на 1
Операция ++ инкрементирует, или увеличивает на 1, свой операнд.
ПРИМЕР3.
int b=10;
cout << "b = " << b << endl; // вывод числа 10
cout << "b = " << ++b << endl; // вывод числа 11 (префиксная форма)
cout << "b = " << b << endl; // вывод числа 11
cout << "b = " << b++ << endl; // вывод числа 11 (постфиксная форма)
cout << "b = " << b << endl; // вывод числа 12
Формы директивы #include
Существует две формы директивы #include. Угловые скобки < > и “”.
Угловые скобки, в которые мы заключили имена файлов IOSTREAM и CMATH, указывают на то, что компилятор будет сначала искать эти файлы в стандартной директории с именем INCLUDE, как правило, содержащей заголовочные файлы для компилятора. Вместо угловых скобок можно использовать и обычные двойные кавычки:
#include "myheader. h"

Двойные кавычки указывают компилятору на то, что поиск файла нужно начинать с текущей директории. Обычно текущей директорией является та, в которой находится исходный файл. Оба указанных способа являются вполне корректными для любого заголовочного файла, однако использование более подходящего из способов ускоряет процесс подключения, поскольку компилятор быстрее найдет нужный файл.
Тест
Разделение программы на функции: является ключевым методом объектно-ориентированного программирования; +упрощает представление программы; +сокращает размер программного кода; ускоряет процесс выполнения программы. После имени функции ставятся (). Тело функции заключается в {}. В чем особенность функции main()? +Это первая функция, вызываемая при запуске программы. Конструкция C++, указывающая компьютеру выполнить действие, называется +Выражением. Напишите пример комментария в стиле C++ и пример устаревшего комментария /*. Выражение:а) всегда приводит к вычислению значения;
б) является способом высказывания программы;
в) всегда происходит вне функции;
г) является частью оператора.
Укажите размер переменных следующих типов в 32-битной системе:а) тип int; 4
б) тип long double; 10
в) тип float; 4
г) тип long. 4
Истинно ли следующее утверждение: переменная типа char может хранить значение 301? +ложно Укажите, к каким элементам программы относятся следующие:а) 12; +целочисленная константа;
б) 'a'; +символьная константа;
в) 4.28915; +константа в формате с плавающей запятой;
г) JungleJim; +имя переменное или идентификатор;
д) JungleJim().+имя функции.
Напишите операторы, выводящие на экран:а) значение переменной x; + cout << 'x';
б) имя Jim; + cout << "Jim";
в) число 509. +cout << 509;
Истинно ли следующее утверждение: в операции присваивания величина, стоящая слева от знака равенства, всегда равна величине, стоящей справа от знака равенства? + Ложно; они не равны, пока не выполнится оператор. Напишите оператор, выводящий значение переменной george в поле размером 10 символов. cout << setw(10) << george; Какой заголовочный файл нужно включить в исходный текст, чтобы использовать объекты cin и cout? IOSTREAM Напишите оператор, который получает с клавиатуры числовое значение и присваивает его переменной temp. cin >> temp; Какой заголовочный файл нужно включить в исходный текст, чтобы использовать манипулятор setw? + IOMANIP Двумя случаями, когда компилятор обрабатывает разделительные символы, являются и * и *+Строковые константы, директивы препроцессора.
Верно или неверно следующее утверждение: нет никаких препятствий к использованию переменных разного типа в одном арифметическом выражении? истинно Значение выражения 11 % 3 равно 2. Действия каких двух типов операций сочетают в себе операции арифметического присваивания? = и + и т. д. Напишите оператор, увеличивающий значение переменной temp на 23 с одновременным присваиванием. Напишите аналогичный оператор, не использующий сложения с присваиванием. temp += 23; temp = temp +23; На какую величину увеличивает значение переменной операция инкремента? 1 Какие значения выведут на экран два указанных оператора, если начальное значение переменной var1 равно 20?
cout << var1--;
cout << ++var1; +20 20


