- Константы
- Работа
Константы
Константа – это лексема языка, представляющая какое-либо фиксированное числовое или иное значение.
Константы делятся на несколько групп: целочисленные, действительные, символьные и строковые. В зависимости от значения константы, компилятор относит ее к одному из известных типов данных, выделяя для нее соответствующее количество байтов памяти.
Целочисленные константы представляют собой запись чисел в одной из допустимых систем счисления: десятичной, двоичной (1), восьмеричной и шестнадцатеричной. Система счисления определяется компилятором следующим образом: если лексема, определенная как константа, начинается с символов «0b» – принимается, что это запись числа в двоичной системе; если лексема начинается с символов «0x» – принимается шестнадцатеричное представление числа. Восьмеричная система подразумевает, что число всегда начинается с нуля. Если же ни один из рассмотренных признаков не обнаружен – принимается десятичная система.
Вот пример записи константы (числа 307) в разных системах счисления:
307 – десятичная запись
0b100110011 – двоичная запись
0463 – восьмеричная запись
0x133 – шестнадцатеричная запись.
По значению константы компилятор определяет наименьший подходящий для нее тип данных. Однако часто необходимо задавать константы так, чтобы они заранее соответствовали конкретному типу, например, нужно определить константу long равную 2. Если просто написать 2, то компилятор посчитает, что для константы достаточно типа char, и будет его и использовать (далее будет показано, к чему это может привести). Чтобы принудительно указать размер константы, используются специальные суффиксы, приписываемые к константе справа:
L – для обозначения long (можно и прописную букву «l» использовать)
U – для обозначения unsigned (можно и прописную букву «u» использовать).
Суффиксы могут использоваться по отдельности или вместе в любых комбинациях. Таким образом, ранее упомянутая константа должна быть записана в виде 2L или 2ul.
Константы действительного типа определяются компилятором по наличию точки в записи лексемы или по наличию символа «e» (или «E»), отделяющего мантиссу (2) от показателя степени числа 10.
Вот пример констант этого типа:
66.2 .1 0. 2.14e-7
Количество байтов, выделенное компилятором для хранения константы, в этом случае определяется формой представления чисел с плавающей точкой, т.е. может быть разным для разных компиляторов. При помощи служебного слова sizeof можно получить константу, равную количеству байтов для хранения константы:
sizeof(3) будет равно 1 (1 байт);
sizeof(3L) будет равно 4 (4 байта),
и т.д.
Символьная константа – это разновидность целочисленной константы, служащей для определения кода алфавитно-цифрового символа. Для обозначения такой константы используется запись символа, окруженного апострофами:
′F′ ′5′ ′.′
Очевидно, что далеко не любой символ можно ввести таким образом. Снять проблему позволяет особый символ «обратная черта» (или back-slash): этот символ (называется escape-символ) позволяет ввести неотображаемые символы, символы «апостроф», «кавычки», «вопрос» и «обратная черта», а так же любой другой символ, указав его код.
Определение символа при помощи escape называется escape-последовательностью(3):
Escape-последовательность | Код символа | Наименование символа |
\a | 0x07 | Звуковой сигнал |
\b | 0x08 | «Забой» (возврат на символ) |
\f | 0x0c | Перевод страницы |
\n | 0x0a | Перевод строки |
\r | 0x0d | Возврат каретки |
\t | 0x09 | Горизонтальная табуляция |
\v | 0x0b | Вертикальная табуляция |
\\ | 0x5c | Обратная черта |
\′ | 0x27 | Апостроф |
\” | 0x22 | Кавычки |
\? | 0x3f | Знак вопроса |
\000 | 000 | Любой восьмеричный код символа |
\0x00 | 0x00 | Любой шестнадцатеричный код символа |
При вводе символов по их кодам в escape-последовательности следует помнить, что код не может быть больше 255 (в десятичном представлении).
Наконец, строковая константа – это последовательность символов, заключенная в кавычки. Среди символов строковой константы могут быть и escape-последовательности. Если введены подряд несколько строковых констант, разделенных лишь пробелами, табуляциями, переводами строки или комментариями – они объединяются в одну строковую константу. Длинные строки можно переносить со строки на строку при помощи символа переноса – той же самой «обратной черты».
Есть несколько особенностей слияния и переноса строк, связанных с обработкой пробелов:
1. Если происходит слияние строк – результирующая строка будет содержать последовательно все символы обеих строк (это очевидно).
2. Если строка переносится при помощи символа переноса, то в результирующую строку будет включены все пробелы от последнего символа до символа переноса и все пробелы от начала следующей строки до константы.
Вот примеры, поясняющие сказанное:
"слияние строк " "123"
"перенос строки \
123"
"еще один вариант\
переноса строки"
"вариант\
переноса"
Компилятор преобразует эти константы в следующие:
"слияние строк 123"
"перенос строки 123"
"еще один вариант переноса строки"
"вариантпереноса"
Важной особенностью строковых констант заключается в том, что компилятор всегда добавляет к явно введенным программистом символам еще один – символ завершения строки, код которого 0х00 (так называемый null-символ или завершающий ноль). Этот символ никак не виден в тексте программы, но обрабатывается компилятором и программой.
- Двоичные константы определены для GNU-расширений Си
- Подразумевается, что читатель знаком с показательной формой записи действиетльных чисел.
- Escape-последовательности ведут свое начало с тех времен, когда работа велась через консольные текстовые терминалы – эти последовательности управляли положением «курсора» на терминале или печатающем устройстве.