Логический тип
Переменная типа bool может принимать только два значения true (истина) или fasle (ложь). Любоезначение, не равное нулю, интерпретируется как true. Значение false представлено в памяти как 0.
Тип void
Множество значений этого типа пусто. Он используется для определения функций, которые не возвращают значения, для указания пустого списка аргументов функции, как базовый тип для указателей и в операции приведения типов.
тема 2 вопрос 12.docx
тема 2 вопрос 12
язык c++ типы данных и операции над данными каждого типа
Символьный тип
Данные типа char в памяти компьютера всегда занимают 1 байт. Символьный тип может
быть со знаком или без него. В величинах со знаком signed char можно хранить значение от
128 до 127. Соответственно значения переменных типа unsigned char могут находиться в
диапазоне от 0 до 255. При работе с символьными данными нужно помнить, что если в
выражении встречается одиночный символ, то он должен быть заключен в одинарные
кавычки (‘a’).
Целочисленный тип
Переменная типа int в памяти компьютера может занимать либо 2, либо 4 байта. Это
зависит разрядности процессора. По умолчанию все целые типы считаются знаковыми, то
есть спецификатор signed можно не указывать. Спецификатор unsigned
позволяетпредставлять только положительные числа. Ниже представлены некоторые
диапазоны значений целого типа
Тип
int
unsigned int
signed int
short int
long int
unsigned short int 0…65535
Диапазон
Размер
2147483648…2147483647 4 байта
0…4294967295
4 байта
2147483648…2147483647 4 байта
32768…32767
2 байта
2147483648…2147483647 4 байта
2 байта
Вещественный тип
Число с плавающей точкой представлено в форме mE + p, где m — мантисса (целое или
дробное число с десятичной точкой), p — порядок (целое число). Обычно величины типа
float занимают 4 байта, а double 8 байт. Таблица диапазонов значений вещественного типа:
4 байта
float
double
8 байт
long double 3,4E4932…3,4E+4932 8 байт
3,4E38…3,4E+38
1,7E308…1,7E+308
Логический тип
Переменная типа bool может принимать только два значения true (истина) или fasle
(ложь). Любоезначение, не равное нулю, интерпретируется как true. Значение false
представлено в памяти как 0.
Тип void
Множество значений этого типа пусто. Он используется для определения функций,
которые не возвращают значения, для указания пустого списка аргументов функции, как
базовый тип для указателей и в операции приведения типов.
Преобразование типов данных
В C++ различают два вида преобразования типов данных: явное и неявное.
Неявное преобразование происходит автоматически. Это выполняется во время
сравнения, присваивания или вычисления выражения различных типов. Например,
следующая программа выведет на консоль значение типа float.
1
2
#include "stdafx.h"
#include 3
4
5
6
7
8
9
1
0
using namespace std;
int main()
{
int i=5; float f=10.12;
cout<>void");
return 0;
}
Наивысший приоритет получает тот тип, при котором информация теряется менее всего.
Не стоит злоупотреблять неявным преобразованием типов, так как могут возникнуть
разного рода непредвиденные ситуации.
Явное преобразование в отличие от неявного осуществляется программистом.
Существует несколько способов такого преобразования:
1. Преобразование в стили C: (float) a
2. Преобразование в стили C++: float()
Также приведения типов может осуществляться при помощи следующих операций:
1
2
3
4
static_cast <> ()
const_cast <> ()
reinterpret_cast <> ()
dynamic_cast <> ()
static_cast — осуществляет преобразование связанных типов данных. Этот оператор
приводит типы по обычным правилам, что может потребоваться в случае, когда
компилятор не выполняет автоматическое преобразование. Синтаксис будет выглядеть
так:
Тип static_cast <Тип> (объект);
С помощью static_cast нельзя убрать константность у переменной, но это по силам
следующему оператору. const_cast — применяется только тогда, когда нужно снять
константность у объекта. Синтаксис будет выглядеть следующим образом:
Тип const_cast <Тип> (объект);
reinterpret_cast применяется для преобразования указателей разных типов, целых к
указателю и наоборот. Если вы увидели новое слово «указатель» — не пугайтесь! это тоже
тип данных, но работать с ним Мы будем не скоро. Синтаксис тут такой же как, у ранее
рассмотренных операторах:
Тип reinterpret_cast <Тип> (объект);
dynamic_cast — используется для динамического преобразования типов, реализует
приведение указателей или ссылок. Синтаксис:
Тип dynamic_cast <Тип> (объект);
Описание переменной: тип_переменной имя_переменной(идентификатор)
Пример описания:
int A,B;
double D;
char K;
Тип переменной определяет диапазон допустимых значений, принимаемых величинами
этого типа; набор операций, допустимых над данной величиной и объем памяти,
отводимой под эту переменную.
Каждый тип имеет свой идентификатор. Идентификато
р
Размер,
бит
Диапазон (множество)
значений
Примечание
unsigned char
char
enum
unsigned int
short int
int
8
8
16
16
16
16
0..255
128..127
32768..32767
0..65535
32768..32767
32768..32767
unsingned long 32
32
long
0..4294967295
2147483648..2147483647
float
double
long double
32
64
80
3.4E38..3.4E+38
1.7E308..1.7E+308
3.4E4932..1.1E+4932
Небольшие целые числа и коды
символов
Очень малые целые числа и
ASCIIкоды
Упорядоченные наборы целых
значений
Большие целые и счетчики циклов
Небольшие целые, управление
циклами
Небольшие целые, управление
циклами
Астрономические расстояния
Большие числа, популяции
Научные расчеты (7 значащих
цифр)
Научные расчеты (15 значащих
цифр)
Финансовые расчеты (19 значащих
цифр)
Обмен информацией с ЭВМ предполагает использование определенных средств ввода
вывода. В ЭВМ основным средством ввода является клавиатура, вывода — дисплей.
В языке C++ функция (метод), которая в режиме диалога с клавиатуры присваивает
значение для переменной величины, выглядит следующим образом:
cin >> переменная;
Например,
float A; int B; char C;
cin >> A;
cin >> B;
cin >> C;
Читается: "Ввести вещественную А, целую В и символьную С".
Получим тот же результат, если запишем:
float A; int B; char C;
cin >> A >> B >> C;
В этом случае, как только в программе встречается вызов cin, ЭВМ приостанавливает
выполнение этой программы и ждет, пока пользователь введет с клавиатуры
соответствующие значения, которые по очереди будут присваиваться переменным,
перечисленным в списке ввода. Значения вводимых данных одновременно отображаются на
экране дисплея. После нажатия клавиши enter, когда все переменные примут свои
значения из входного набора данных, определенного пользователем, выполнение
программы продолжается с оператора, следующего за cin.
В С++ команда, которая выводит содержимое переменных (выражений) на экран, выглядит
следующим образом
cout << переменная;
Например
cout << "Выходное значение: " << C;
В списке вывода этих операторов может быть либо одно выражение, либо
последовательность таких выражений, аналогично функции cin.
Для управления размещением выводимых значений функция cout используется с
форматом. Под форматом данных понимается расположение и порядок кодирования
отдельных полей элементов данных. Для такого форматирования применяется функция:
cout.width(колво_позиций);
В языке C++ также существуют перечислимый тип – enum, который является
подмножеством целого типа, и пустой тип – void, который имеет специальное назначение.
Он используется для объявления функций, которые не возвращают никакого значения, а
также для объявления указателей на значение типа void. Такие указатели могут быть
преобразованы к указателям на любой другой тип.
В языке С++ можно объявлять структуры и так называемые объединения.
В языке C++ нет специальных типов для массивов и строк, которые представляются
массивом символов.
В языке С не существовало логического типа. Логические значения представлялись
данными целого типа, при этом значение 0 соответствовало логическому значению ложь, а
все остальные целые значения соответствовали логическому значению истина. В языке
С++ сохранена данная логика. По определению, true имеет значение 1 при преобразовании
к целому типу, а false – значение 0. И наоборот, целые можно неявно преобразовать в
логические значения: при этом ненулевые целые преобразуются в true, а ноль – в false. В
любом месте, где требуется логическое значение, может стоять целочисленное выражение.
В арифметических и логических выражениях логические значения преобразуются в целые,
операции выполняются над преобразованными величинами.
Указатель можно неявно преобразовать в логическое значение, при этом ненулевой
указатель принимает значение true, нулевой – false.
Такой подход позволяет вместо логической и целочисленной переменных объявлять только
целочисленную, при этом значение переменной, равное 0, говорит об отсутствии
некоторого признака у объекта, а остальные значения говорят о его наличии, и при этом
несут какуюлибо дополнительную информацию.
При выполнении бинарных операций производятся преобразования по умолчанию для
приведения операндов к одному и тому же типу, который потом используется как тип
результата:
1. если один из операндов имеет тип long double, другой тоже преобразуется в long
double;
иначе, если один операнд имеет тип double, то второй операнд преобразуется
к типу double;
иначе, если один операнд имеет тип float, то второй операнд преобразуется к
типу float;
иначе над обоими операндами производится интегральное продвижение, а
именно: значения типов char, signed char, unsigned char, short int и unsigned
short int преобразуются в int, если int может представить все значения
исходных типов, в противном случае они преобразуются в unsigned int; bool
преобразуется в int.
2.
затем если один операнд имеет тип unsigned long, то второй операнд преобразуется
к типу unsigned long;
иначе, если один из операндов относится к типу long int, а другой к типу
unsigned int, то если long int может представить все значений типа unsigned
int, unsigned int преобразуется в long int, иначе оба операнда преобразуются в
unsigned long int;
иначе, если один операнд имеет тип long int, то второй операнд
преобразуется к типу long int;
иначе, если один операнд имеет тип unsigned int, то второй операнд
преобразуется к типу unsigned int;
иначе оба операнда имеют тип int. В языке С++ нет операций преобразования между символом и кодом символа, т.к. в
оперативной памяти символ и так хранится в виде его кода. Поэтому можно к переменной,
хранящей символ, прибавить 1 и получить следующий символ.
5. Операции языка C++
Данная таблица описывает операции языка C++. Операции разделены на группы,
расположенные в порядке убывания приоритета операций.
Знак операции
Наименование
Ассоциативность
::
Разрешение области видимости
Слева направо
( ) [ ] . >
++
static_cast
dynamic_cast
reinterpret_cast
const_cast
~ ! * &
++
sizeof
(< тип
new
delete
>)<
выражение
>
. * > *
* / %
+
<<
>>
< > <= >=
== !=
&
^
|
&&
||
? :
Первичные
Постфиксный инкремент и
декремент
Преобразование с проверкой во
время компиляции
Преобразование с проверкой во
время выполенения
Преобразование без проверки
Константное преобразование
Унарные
Префиксный инкремент и
декремент
Вычисление размера
Приведение типа
Выделение памяти
Освобождение памяти
Выбор члена класса
Мультипликативные
Аддитивные
Сдвиг
Отношение
Отношение
Поразрядное И
Слева направо
Справа налево
Слева направо
Слева направо
Слева направо
Слева направо
Слева направо
Слева направо
Слева направо
Поразрядное исключающее ИЛИ
Слева направо
Поразрядное ИЛИ
Логическое И
Логическое ИЛИ
Условная операция
Слева направо
Слева направо
Слева направо
Справа налево
= *=
/=
%=
+=
=
<<=
Простое и составное присваивания Справа налево Знак операции
Наименование
Ассоциативность
>>=
&=
^=
|=
Генерация исключения
Слева направо
Операция последовательного
вычисления
Слева направо
throw
,
:: – операция разрешения области видимости. При повторном объявлении имени во
вложенном блоке или классе предыдущие объявления оказываются скрытыми.
Однако скрытое имя члена класса можно использовать, квалифицировать его
именем класса при помощи операции разрешения области видимости. Скрытое
глобальное имя можно использовать, если квалифицировать его унарной операцией
разрешения области видимости.
( ) – выражение в скобках (используется для изменения порядка вычисления) или
вызов функции.
[ ] – индексное выражение, используется для работы с массивами.
. и > – выбор элемента, используются при работе с классами, структурами и
объединениями.
Операции static_cast (преобразование с проверкой во время компиляции),
dynamic_cast (преобразование с проверкой во время выполнения), reinterpret_cast
(преобразование без проверки), const_cast (константное преобразование)
осуществляют различные преобразования типов. Они имеют следующий синтаксис:
операция<новый тип>(выражение). Угловые скобки являются элементом
синтаксиса. Операция static_cast осуществляет преобразование родственных типов,
например, указателя на один тип к указателю на другой тип из той же иерархии
классов, целый тип в перечисление или тип с плавающей точкой в интегральный.
Операция reinterpret_cast управляет преобразованиями между несвязанными
типами, например, целых в указатели или указателей в другие (несвязанные)
указатели. Такое различие позволяет компилятору осуществлять минимальную
проверку типов при использовании static_cast, а программисту – легче обнаружить
опасные преобразования, представляемые reinterpret_cast. Преобразование
dynamic_cast выполняется и проверяется на этапе выполнения. Преобразование
const_cast аннулирует действие модификатора const.
– унарный минус.
~ – обратный код (см. лекцию 8).
! – логическое отрицание.
* – косвенная адресация (см. лекцию 5).
& – адресация (см. лекцию 5).
Операции ++ и инкрементируют (увеличивают на 1) и декрементируют
(уменьшают на 1) свой операнд. Операнд должен иметь целый, вещественный тип
или быть указателем. Операции инкремента и декремента могут записываться как
перед своим операндом (префиксная форма записи), так и после него (постфиксная
форма записи). При префиксной форме записи операнд сначала инкрементируется
или декрементируется, а затем его новое значение участвует в дальнейшем
вычислении выражения, содержащего данную операцию. При постфиксной форме
записи операнд инкрементируется или декрементируется лишь после того, как его
старое значение участвует в вычислении выражения. Таким образом, результатом
операций инкремента и декремента является либо новое, либо старое значение
операнда. Например, если переменная i = 0, то выражение a[++i] = 1 меняет элемент a[1], а выражение a[i++] = 1 меняет элемент a[0]. В обоих случая переменная i
получает новое значение, равное 1.
sizeof – вычисление размера в байтах переменной или типа.
Операция приведения типа записывается следующим образом: (<новый
тип>)<выражение>. Например, (long int)n приводит переменную n к типу long int.
При преобразовании типов надо помнить, что при преобразовании между
знаковыми/беззнаковыми значениями и при преобразовании от типа с большей
размерностью к типу с меньшей размерностью могут возникнуть ошибки. Более
безопасным способом преобразования типов является использование операций
static_cast, dynamic_cast, reinterpret_cast и const_cast.
% – остаток от деления.
В языке C++ имеется одна тернарная операция – условная операция. Она имеет
следующий синтаксис: <операнд 1> ? <операнд 2> : <операнд 3>. Если <операнд 1>
имеет ненулевое значение, то вычисляется <операнд 2> и результатом условной
операции является его значение. Если же <операнд 1> равен нулю, то вычисляется
<операнд 3> и результатом является его значение. В любом случае вычисляется
только один из операндов, <операнд 2> или <операнд 3>, но не оба.
Простое присваивание. Операция простого присваивания обозначается знаком
«=». Значение правого операнда присваивается левому операнду. Операция
вырабатывает результат, который может быть далее использован в выражении.
Результатом операции является присвоенное значение. Например, выражение a = b =
c = 0 присваивает всем переменным значение 0, а в результате вычисления
выражения a = (b = 3) + (c = 5) переменная c будет иметь значение 5, переменная b
будет иметь значение 3, и переменная a будет иметь значение 8.
Составное присваивание. Операция составного присваивания состоит из простой
операции присваивания, скомбинированной с какойлибо другой бинарной
операцией. При составном присваивании вначале выполняется действие,
специфицированное бинарной операцией, а затем результат присваивается левому
операнду. Оператор n += 5 эквивалентен оператору n = n + 5, но при этом первый
оператор легче для понимания и выполняется быстрее.
Операция последовательного вычисления «,» обычно используется для
вычисления нескольких выражений в ситуациях, где по синтаксису допускается
только одно выражение. Однако, запятая, разделяющая параметры функции, не
является операцией последовательного вычисления.
Порядок вычислений подвыражений внутри выражений не определён. В частности, не стоит
предполагать, что выражения вычисляются слева направо.
int x = f(2) + g(3);
// Неизвестно, какая функция вызовется первой – f()
или g()
При отсутствии ограничений на порядок вычислений можно сгенерировать более
качественный код. Однако отсутствие ограничений на порядок вычислений может
привести к неопределённым результатам.
Логические операции «И» и «ИЛИ», условная операция и операция последовательного
вычисления гарантируют определенный порядок вычисления своих операндов.
Условная операция вычисляет сначала свой первый операнд, а затем, в зависимости от его
значения, либо второй, либо третий операнд. Логические операции также обеспечивают
вычисление своих операндов слева направо, причём логические операции вычисляют
минимальное число операндов, необходимое для определения результата выражения.
Таким образом, второй операнд выражения может вообще не вычисляться. Операция
последовательного вычисления обеспечивает вычисление своих операндов по очереди,
слева направо. Обратите внимание, что запятая в качестве указателя последовательности логически отличается от запятой, используемой в качестве разделителя параметров при
вызове функций.
f1(v[i], i++);
f2((v[i], i++));
// Два параметра
// Один параметр
Вызов функции f1 осуществляется с двумя параметрами v[i] и i++, и порядок вычисления
параметров не определён. Расчет на определённый порядок вычисления параметров
является исключительно плохим стилем и приводит к непредсказуемому поведению
программы. Вызов функции f2 имеет один параметр – последовательность выражений,
разделённых запятой. Порядок вычисления гарантирован, и вызов эквивалентен f2(i++).
Лекция "Язык c++ типы данных "
Лекция "Язык c++ типы данных "
Лекция "Язык c++ типы данных "
Лекция "Язык c++ типы данных "
Лекция "Язык c++ типы данных "
Лекция "Язык c++ типы данных "
Лекция "Язык c++ типы данных "
Лекция "Язык c++ типы данных "
Материалы на данной страницы взяты из открытых истончиков либо размещены пользователем в соответствии с договором-офертой сайта. Вы можете сообщить о нарушении.