Программисты на C++ могут использовать пять типов данных из C: void, int, float, double и char.
| Тип | Описание |
|---|---|
| void | не соответствует никакому типу |
| int | целый |
| float | вещественный очень малой точности |
| double | вещественный двойной точности |
| char | символьный |
Кроме того в C++ есть типы: bool и wchar_t.
| Тип | Описание |
|---|---|
| bool | логический, true (истина) или false (ложь) |
| wchar_t | расширенный символьный (должен поддерживать все представимые в системе символы) |
Некоторые из перечисленных типов можно модифицировать ключевыми словами signed (знаковый), unsigned (беззнаковый), short (короткий) и long (длинный). Если тип не указывается, то подразумевается тип int. Полный набор возможных типов с модификаторами показан ниже (одинаковые типы записаны в одной строке):
| целочисленные типы | |||
|---|---|---|---|
| bool | |||
| char | |||
| signed char | |||
| unsigned char | |||
| wchar_t | |||
| short | short int | signed short | signed short int |
| unsigned short | unsigned short int | ||
| int | signed | signed int | |
| unsigned | unsigned int | ||
| long | long int | signed long | signed long int |
| unsigned long | unsigned long int | ||
| вещественные типы | |||
| float | |||
| double | |||
| long double | |||
| частично поддерживаемые целочисленные типы | |||
| long long | long long int | signed long long | signed long long int |
| unsigned long long | unsigned long long int | ||
Размеры и диапазоны значений типов зависят от используемого процессора и компилятора. Заголовочный файл «cfloat» (или «float.h») содержит характеристики для вещественных типов, а «climits» (или «limits.h») - для целочисленных типов. Вы можете использовать операцию sizeof для определения размера любого типа (в байтах). Однако для большинства архитектур эти размеры совпадают: int и float обычно 32 бита, char - 8 бит, а double - 64 бита; для хранения bool используется 1 бит, long long - 64 бита.
Ограничения для числовых типов определены в заголовочном файле <limits>. Методы и константы шаблонного класса numeric_limits описаны ниже. Специализация этого класса может быть определена для любого пользовательского типа данных.
| Метод или константа | Тип результата | Описание |
|---|---|---|
| is_specialized | bool | |
| radix | int | основание показателя степени |
| digits | int | количество (двоичных) цифр в мантиссе |
| digits10 | int | количество десятичных цифр в мантиссе |
| is_signed | bool | число со знаком? |
| is_integer | bool | целое? |
| is_exact | bool | точное? |
| min() | <тип> | нормализованное минимальное значение (для вещественных положительное) |
| max() | <тип> | наибольшее значение |
| epsilon() | <тип> | точность, такое что 1 + epsilon > 1 |
| round_error() | <тип> | ошибка округления |
| infinity() | <тип> | бесконечность |
| quiet_NaN() | <тип> | неверное число, не сигнализирующее об ошибке |
| signaling_NaN() | <тип> | неверное число, сигнализирующее об ошибке |
| denorm_min() | <тип> | ненормализованное минимальное значение |
| min_exponent | int | минимальная (двоичная) экспонента |
| min_exponent10 | int | минимальная десятичная экспонента |
| max_exponent | int | максимальная (двоичная) экспонента |
| max_exponent10 | int | максимальная десятичная экспонента |
| has_infinity | bool | есть бесконечность? |
| has_quiet_NaN | bool | |
| has_signaling_NaN | bool | |
| has_denorm | <тип>_denorm_style | |
| has_denorm_loss | bool | |
| is_iec559 | bool | соответствует IEC-559? |
| is_bounded | bool | ограничен? |
| is_modulo | bool | по модулю? |
| traps | bool | |
| tinyness_before | bool | |
| round_style | float_round_style { round_to_nearest, … } | тип округления |
В основном используется для проверки границ, определения максимальных и минимальных значений, которые может содержать данный тип. Код ниже печатает минимум и максимум типа short для конкретного компьютера.
#include <limits> std::cout << "Maximum short value: " << std::numeric_limits<short>::max() << std::endl; std::cout << "Minimum short value: " << std::numeric_limits<short>::min() << std::endl;
Объявление с простым типом несложно понять:
int i
Но как понять эти более сложные объявления:
double **d[8] // хмм... char *(*(**foo [][8])())[] // черт! что такое foo?
Чтобы понять эти объявления используйте следующие три правила:
d или foo в примерах выше)double или char выше)Например:
| Выражение | Значение |
|---|---|
double **d[8]; | |
double | d это … double |
double | d это массив из 8 … double |
double | d это массив из 8 указателей на … double |
double **d[8]; | d это массив из 8 указателей на указатель на double |
Второй пример:
| Выражение | Значение |
|---|---|
char *(*(**foo [][8])())[] | |
| foo это … char |
| foo это массив из … char |
| foo это массив из массивов из 8 … char |
| foo это массив из массивов из 8 указателей на … char |
| foo это массив из массивов из 8 указателей на указатель на … char |
| foo это массив из массивов из 8 указателей на указатель на функцию, возвращающую … char |
| foo это массив из массивов из 8 указателей на указатель на функцию, возвращающую указатель на … char |
| foo это массив из массивов из 8 указателей на указатель на функцию, возвращающую указатель на массив из … char |
| foo это массив из массивов из 8 указателей на указатель на функцию, возвращающую указатель на массив из указателей на char |
Другие примеры можно посмотреть в прекрасном руководстве Steve Friedl о чтении объявлений на C: http://www.unixwiz.net/techtips/reading-cdecl.html.