Двоичная система основана на базе счисления, равной двум. В этой системе есть только две цифры: 0
и 1
. В языке С++ невозможно непосредственно представить двоичные числа как литералы. В качестве литералов и формата ввода-вывода в языке С++ непосредственно поддерживаются только восьмеричные, десятичные и шестнадцатеричные числа. Однако двоичные числа полезно знать, даже если мы не можем явно представить их в тексте программы. Например, десятичное число 123
равно 1*2^6+1*2^5+1*2^4+1*2^3+0*2^2+1*2+1
, т.е. 1*64+1*32+1*16+1*8+0*4+1*2+1
, т.е. (в двоичном виде) 1111011
.
A.2.2. Литералы с плавающей точкой
.
), показатель степени (например, e3
) или суффикс, обозначающий число с плавающей точкой (d
или f
). Рассмотрим примеры.
123 // int (нет десятичной точки, суффикса или показателя степени)
123. // double: 123.0
123.0 // double
.123 // double: 0.123
0.123 // double
1.23e3 // double: 1230.0
1.23e–3 // double: 0.00123
1.23e+3 // double: 1230.0
Литералы с плавающей точкой имеют тип double
, если суффикс не означает иное. Рассмотрим примеры.
1.23 // double
1.23f // float
1.23L // long double
A.2.3. Булевы литералы
Литералами типа bool
являются литералы true
и false
. Целочисленное значение литерала true
равно 1
, а литерала false
— 0
.
A.2.4. Символьные литералы
'a'
или '@'
. Кроме того, существует несколько специальных символов.
Специальный символ представляется с помощью имени в языке C++, заключенного в одинарные кавычки, например '\n'
(новая строка) и '\t'
(табуляция).
Набор символов содержит следующие видимые символы:
abcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZ
0123456789
!@#$%^&*_+|~`{}[]:";'<>?,./
В переносимом коде нельзя рассчитывать на дополнительные видимые символы. Значение символа, например 'a'
для буквы a
, зависит от реализации (но его легко выяснить, например, выполнив инструкцию, cout << int('a')
).
A.2.5. Строковые литералы
"Knuth"
и "King Canute"
. Строковый литерал нельзя произвольно разбивать на несколько строк; для перехода на новую строку используется специальный символ \n
.
"King
Canute" // ошибка: переход на новую строку в строковом литерале
"King\nCanute" // OK: правильный переход на новую строку
Два строковых литерала, разделенных только одним пробелом, считаются одним строковым литералом. Рассмотрим пример.
"King" "Canute" // эквивалентно "KingCanute" (без пробела)
Обратите внимание на то, что специальные символы, такие как \n
, могут входить в строковые литералы.
A.2.6. Указательные литералы
Существует только один 0
). В качестве нулевого указателя можно использовать любое константное выражение, равное 0
.
t* p1 = 0; // OK: нулевой указатель
int* p2 = 2–2; // OK: нулевой указатель
int* p3 = 1; // ошибка: 1 — int, а не указатель
int z = 0;
int* p4 = z; // ошибка: z — не константа
В данном случае значение 0
неявно превращается в нулевой указатель. Как правило (но не всегда), нулевой указатель представляется в виде битовой маски, состоящей из одних нулей, как и число 0
.
В языке C++ (но не в языке C, поэтому будьте осторожны с заголовками языка C) литерал NULL
по определению равен 0
, поэтому можно написать следующий код:
int* p4 = NULL; // ( при правильном определении литерала NULL)
// нулевой указатель
В языке C++0x нулевой указатель будет обозначаться ключевым словом nullptr
. А пока рекомендуем использовать для этого число 0
.
A.3. Идентификаторы