Константы

Константы – это выражения с фиксированным значением.
Они используются для выражения определенных значений в исходном коде программы. Мы уже использовали некоторые из предыдущих разделов, чтобы дать конкретные значения переменным или выразить сообщения, которые мы хотели, чтобы наши программы печатались, например, когда мы писали:

a = 5;

В этом фрагменте кода была буквальная константа .

Литеральные константы можно разделить на: целочисленные, с плавающей запятой, символы, строки, логические, указатели и пользовательские литералы.

Целочисленные числа

1776
707
-273

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

В дополнение к десятичным числам (те, которые большинство из нас используют каждый день), C ++ позволяет использовать восьмеричные числа (база 8) и шестнадцатеричные числа (база 16) в качестве литерала. Для восьмеричных литералов цифрам предшествует 0символ (ноль). А для шестнадцатеричных им предшествуют символы 0x(ноль, х). Например, следующие литерал-константы эквивалентны друг другу:

1
2
3
75         // decimal
0113       // octal
0x4b       // hexadecimal  

Все они представляют одно и то же число: 75 (семьдесят пять), выраженное как цифра base-10, восьмеричная цифра и шестнадцатеричная цифра, соответственно.

Эти литеральные константы имеют тип, как и переменные. По умолчанию целочисленные литералы имеют тип int. Однако некоторые суффиксы могут быть добавлены к целочисленному литералу для указания другого целочисленного типа:

Суффикс Тип модификатора
u или U unsigned
l или L long
ll или LL long long

Неподписанные могут быть объединены с любым из двух других в любом порядке для формирования unsigned longили unsigned long long.

Например:

1
2
3
4
5
75         // int
75u        // unsigned int
75l        // long
75ul       // unsigned long 
75lu       // unsigned long 

Во всех вышеперечисленных случаях суффикс может быть задан с использованием строчных или строчных букв.

Числа с плавающей запятой

Они выражают реальные значения с десятичными знаками и / или показателями. Они могут включать в себя либо десятичную точку, либо eсимвол (который выражает «на десять на X-й высоте» , где X – целочисленное значение, которое следует за eсимволом), либо как десятичная точка, так и eсимвол:

1
2
3
4
3.14159    // 3.14159
6.02e23    // 6.02 x 10^23
1.6e-19    // 1.6 x 10^-19
3.0        // 3.0  

Это четыре допустимых числа с десятичными знаками, выраженными в C ++. Первое число – это PI, второе – число Авогадро, третье – электрический заряд электрона (крайне небольшое число) – все они аппроксимированы, а последнее – это число три, выраженное как плавающее, числовой литерал.

Тип по умолчанию для литералов с плавающей запятой double. Литералы с плавающей запятой типа floatили long doubleмогут быть указаны путем добавления одного из следующих суффиксов:

Суффикс Тип
f или F float
l или L long double

Например:

1
2
3.14159L   // long double
6.02e23f   // float  

Любой из букв , которые могут быть частью с плавающей точкой числовой константы ( efl) может быть записан с использованием либо более низкие или заглавные букв без разницы в значении.

Символьные и строковые литералы

Символьные и строковые литералы заключены в кавычки:

1
2
3
4
'z'
'p'
"Hello world"
"How do you do?"

Первые два выражения представляют собой односимвольные литералы , а следующие два представляют строковые литералы, состоящие из нескольких символов. Обратите внимание, что для представления одного символа мы заключим его между одинарными кавычками ( ') и выражая строку (которая обычно состоит из более чем одного символа), мы заключаем символы между двойными кавычками ( ").

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

x
'x'

x'x'(заключенный в одинарные кавычки) будет ссылаться на буквенный символ 'x'(символ, который представляет строчную букву x ).

Символьные и строковые литералы могут также представлять специальные символы, которые трудно или невозможно выразить иначе в исходном коде программы, например, newline ( \n) или tab ( \t). Этим специальным символам предшествуют символы обратной косой черты ( \).

Здесь у вас есть список кодов исключения одного символа:

Код выхода Описание
\n новая линия
\r возврат каретки
\t табуляция
\v вертикальная вкладка
\b возврат на одну позицию
\f feed (подача страницы)
\a предупреждение (звуковой сигнал)
\' одинарная кавычка ( ')
\" двойная кавычка ( ")
\? вопросительный знак ( ?)
\\ обратная косая черта ( \)

Например: внутренне компьютеры представляют символы как числовые коды: как правило, они используют одно расширение системы кодирования символов ASCII (подробнее см. ASCII-код ). Символы также могут быть представлены в литералах с использованием его числового кода, написав символ обратной косой черты ( ), за которым следует код, выраженный как восьмеричный (базовый-8) или шестнадцатеричный (базовый-16) номер. Для восьмеричного значения обратная косая черта сопровождается непосредственно цифрами; в то время как для шестнадцатеричного символа символ вставляется между обратной косой чертой и шестнадцатеричными цифрами (например: или ).

'\n'
'\t'
"Left \t Right"
"one\ntwo\nthree"

\x\x20\x4A

Несколько строковых литералов можно объединить, чтобы сформировать один строковый литерал, просто разделив их на один или несколько пробелов, включая табуляции, новые строки и другие допустимые пробелы. Например:

1
2
"this forms" "a single"     " string "
"of characters"

Вышеупомянутый строковый литерал эквивалентен:

"this formsa single string of characters"

Обратите внимание, что пробелы внутри кавычек являются частью литерала, а те, что вне их, – нет.

Некоторые программисты также используют трюк для включения длинных строковых литералов в несколько строк: в C ++ обратная косая черта ( \) в конце строки считается символом продолжения строки, который объединяет эту строку и следующую в одну строку. Поэтому следующий код:

1
2
x = "string expressed in \
two lines"

эквивалентно:

 
x = "string expressed in two lines"

Все литералы символов и строковые литералы, описанные выше, сделаны из символов типа char. Другой тип символа можно указать, используя один из следующих префиксов:

Префикс Тип символа
u char16_t
U char32_t
L wchar_t

Обратите внимание, что в отличие от суффиксов типов для целых литералов эти префиксы чувствительны к регистру : строчные char16_tи верхние регистры для char32_tи wchar_t.

Для строковых литералов, помимо вышеуказанного uUи L, существуют два дополнительных префиксов:

Префикс Описание
u8 Строковый литерал кодируется в исполняемом файле с использованием UTF-8
R Строковый литерал – это необработанная строка

В необработанных строках обратные косые черты и одиночные и двойные кавычки – все допустимые символы; содержимое литерала ограничивается начальным и конечным , где любая последовательность символов (включая пустую последовательность). Содержание строки – это то, что находится внутри скобки, игнорируя сама разделительную последовательность. Например:R"sequence()sequence"sequence

1
2
R"(string with \backslash)"
R"&%$(string with \backslash)&%$"

Обе строки выше эквивалентны "string with \\backslash"RПрефикс может быть объединен с любыми другими префиксами, например uLили u8.

Другие литералы

Три ключевых слова литералов существуют в C ++: truefalseа nullptr:

  • trueи falseявляются двумя возможными значениями для переменных типа bool.
  • nullptrэто значение нулевого указателя .
1
2
3
bool foo = true;
bool bar = false;
int* p = nullptr;

Типированные постоянные выражения

Иногда удобно указывать имя постоянному значению:

1
2
const double pi = 3.1415926;
const char tab = '\t';

Затем мы можем использовать эти имена вместо литералов, для которых они были определены:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
using namespace std;

const double pi = 3.14159;
const char newline = '\n';

int main ()
{
  double r=5.0;               // radius
  double circle;

  circle = 2 * pi * r;
  cout << circle;
  cout << newline;
}
31,4159

Определения препроцессора (#define)

Другим механизмом для обозначения постоянных значений является использование определений препроцессора. Они имеют следующий вид:#define identifier replacementпосле этой директивы любое появление identifierв коде интерпретируется как replacement, где замена представляет собой любую последовательность символов (до конца строки). Эта замена выполняется препроцессором и происходит до того, как программа скомпилирована, что вызывает некоторую слепую замену: действительность типов или синтаксиса не проверяется каким-либо образом.

Например:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
using namespace std;

#define PI 3.14159
#define NEWLINE '\n'

int main ()
{
  double r=5.0;               // radius
  double circle;

  circle = 2 * PI * r;
  cout << circle;
  cout << NEWLINE;

}
31,4159

Обратите внимание, что #defineстроки являются препроцессорными директивами и, как таковые, являются однострочными инструкциями, которые, в отличие от операторов C ++, не требуют точки с запятой (;) в конце; директива распространяется автоматически до конца строки. Если точка с запятой включена в строку, она является частью последовательности замещения и также включена во все замещенные вхождения.

Залишити відповідь