3.1.4. Строки
3.1.4. Строки
Строка – это последовательность символов алфавита, заключенных в двойные кавычки:
"<последовательность символов>"
Примером строки является следующая конструкция: "Это строка языка Си". Пробел является значащим символом строки, а двойные кавычки вводятся для того, чтобы отметить в программе начало и конец строки. По тому, как строки выглядят в тексте программы, их можно отнести к классу строковых констант, однако, строго говоря, строка не является константой и рассматривается компилятором как массив (последовательность элементов), в котором каждый элемент занимает один байт и имеет значение кода соответствующего символа, входящего в состав строки.
В конец строки компилятор помещает нулевой байт – "нуль-символ" (NULL), который используется для того, чтобы отметить конец строки. Таким образом, строка занимает в памяти на 1 байт больше, чем количество содержащихся в ней символов. Нуль-символ – это не символ алфавита 0, он не выводится на печать, в таблице кодов ASCII имеет номер 0 и его двоичный код состоит только из нулей (\0). В отличие от нуль-символа "символ-цифра 0" имеет код \60.
Ввиду того, что строка рассматривается компилятором не как константа, а как массив символов, каждая строка сохраняется в отдельном месте памяти, даже если она идентична уже имеющейся в памяти какой-либо другой строке.
В состав последовательности символов строки могут входить любые символы, в том числе символы из таблицы 3.3 (без обрамления их одинарными кавычками) и символы, определяемые кодами \ddd и \xHHH. Например, чтобы напечатать из программы текст Запомните, "символ \ называется обратной дробной чертой (back slash)", выводимую строку в программе можно записать так:
"Запомните, \"символ \\ называется обратной дробной чертой (back slash)\".\n"
или
"Запомните, \x22 символ \x5c называется обратной дробной чертой (back slash)\x22.\n"
В состав строки включены символы таблицы 3.3: \" , \\ и \n. Наличие управляющего символа \n в конце сроки вызовет после вывода текста перевод на новую строку.
Необходимо четко различать символьные константы и строки. Например, 'xy' – это двухбайтовая символьная константа, "xy" – строка, занимающая 3 байта памяти, "" – пустая строка, занимающая 1 байт памяти, в котором записан нуль-символ.
Так как строки – это, по сути, массивы, их можно программным путем обрабатывать, заменяя или перекомпоновывая в памяти символы, определять длину строки по конечному нуль-символу и т.д.
Компилятор Турбо-Си производит объединение нескольких строк в одну, если они записаны в программе друг за другом.
Например:
"Это пример того, как Турбо-Си"
"автоматически \n осуществляет объединение"
"строк в одну длинную строку, \n"
"что может быть нами использовано для большей"
"наглядности программы. \n"
В этом случае в памяти будет сформирована одна длинная строка, в конце которой будет проставлен нуль-символ.
3.1.3. Символьные константы
3.1.3. Символьные константы
Символьная константа – это некоторый символ алфавита, заключенный в одиночные кавычки: '<символ_алфавита>' .
Примеры символьных констант: 'a' 'B' '=' '+' 'F' '[' 'd'.
Значением символьной константы является целое число, равное ASCII-коду (American Standard Code for Information Interchange, Американский стандартный код обмена информацией) данного символа. Символьная константа имеет тип int(char) и представляется 16(8)-битной величиной.
В таблице кодов ASCII (см. приложение) имеются коды, которые не отображаются при печати, а производят некоторые действия, например, перевод на новую строку (LF), подача звукового сигнала, гудка – BELL) и т. д. Для таких кодов на клавиатуре не предусмотрено отдельных клавиш, и при вводе с клавиатуры они набираются сочетанием определенных клавиш: например, нажатие клавиши Ctrl и G влечет за собой поступление в память кода "гудок", а при выводе символа, имеющего значение кода "гудок", компьютер подает звуковой сигнал.
Возникает вопрос: каким образом использовать подобные коды в программе? Для этого Си предоставляет два способа, имеющих непосредственное отношение к символьным константам.
Первый способ. Любой символ таблицы ASCII-кодов можно определить в виде символьной константы следующим образом:
'\ddd' или '\xHHH',
где ddd – восьмеричный, а HHH шестнадцатеричный код символа. Ведущие нули в представлении кода символа можно не записывать. Таким образом, в соответствии с этим вышеуказанные примеры символьных констант можно записать
символ |
'a' |
'B' |
'=' |
'+' |
'F' |
'[' |
'd' |
код |
'\141' |
'\102' |
'\75' |
'\53' |
'\106' |
'\133' |
'\144' |
код |
'\x61' |
'\x42' |
'\x3D' |
'\x2B' |
'\x46' |
'\x5B' |
'\x64' |
Символ, вызывающий подачу звукового сигнала, записывается в виде '\07', а символ, вызывающий перевод печати на новую строку – '\x0A'.
Второй способ заключается в том, что часто используемые неотображаемые символы не нужно записывать их кодами, а можно использовать для них зарезервированные обозначения. Эти символы в Си выделены в класс управляющих символов, представленных в таблице 3.3.
Таблица 3.3. Управляющие символы
Символ Си | Символ ASCII | Название символа |
\n' |
LF |
Новая строка |
'\t' |
HT |
Горизонтальная табуляция |
'\v' |
VT |
Вертикальная табуляция |
'\b' |
BS |
Шаг назад |
'\r' |
CR |
Возврат каретки |
'\f' |
FF |
Подача бланка |
\a' |
BEL |
Гудок |
'\'' |
' |
Одинарная кавычка |
'\"' |
" |
Двойная кавычка |
'\\' |
\ |
Обратная дробная черта |
'\?' |
? |
Вопрос |
Если управляющие символы встречаются, например, в строке вывода, то они вызывают соответствующее действие. Первые шесть управляющих символов являются символами управления работой печатающего устройства: символ "новая строка" переводит печать на начало следующей строки; символ "горизонтальная табуляция" продвигает печать в текущей строке в очередную фиксированную позицию строки. По умолчанию позиции в строке фиксируются через каждые 8 символов. Фиксированные позиции можно изменять, используя так называемые ESC-последовательности, формат которых описывается в документации по принтеру.
Символ "вертикальная табуляция" продвигает печать на начало очередных фиксированных номеров строк, которые также определяются ESC-последовательностью принтера.
Символ "шаг назад" производит сдвиг печати в текущей строке на одну позицию назад, т.е. позволяет на одном и том же знакоместе напечатать некоторое количество символов.
Символ "подача бланка" производит пропуск оставшейся части текущего текста и начинает печать со следующего нового листа.
Седьмой символ таблицы "гудок" инициирует подачу звукового сигнала. Оставшиеся четыре символа не относятся, по сути, к управляющим, но они включены в таблицу, так как имеют аналогичные зарезервированные обозначения. Их обычное использование в строковых константах (см. следующий раздел 3.1.4.) в качестве символов могло бы привести к ошибке, а использование именно в таком виде позволяет печатать их в строке вывода.
Сказанное не относится к символу "вопрос". По всей вероятности, символ "вопрос" попал в число зарезервированных символов в связи с тем, что в Си имеется операция, обозначаемая знаком "?", и в некоторых ситуациях это могло бы привести к неоднозначному толкованию конструкций языка. Знак "вопрос", как символьную константу, можно записать любым рассмотренным способом: '?' '\77' 'x3F' '\?' .
В заключение раздела обращаем внимание на то, что символьные константы являются целыми константами. Следовательно, допустима запись и двухсимвольных констант, например, таких: 'ab' 'ta' 'ma' 'do'. Однако в этом случае их необходимо обрабатывать как данные типа int. Если двухсимвольную константу попытаться присвоить переменной типа char, то произойдет потеря второго символа.
Двухсимвольную константу можно записать в виде '\ddC' или в виде '\xHHc', где С – символ алфавита отличный от восьмеричной цифры, с – символ, отличный от шестнадцатеричной цифры. Например, '\538' все равно что '+8', ибо компилятор воспринимает \53 как восьмеричный код символа +, за которым стоит символ 8. Аналогично '\x6DQ'воспринимается как 'mQ', т.е. \x6D – шестнадцатеричный код символа m, за которым записан символ Q. Мы не советуем применять такие "хитроумные штучки", хотя Си предоставляет в этом плане широчайшие возможности.
Таблица символьного типа
Тип и стандартная длина | Модифи-катор | Реакция компилятора длина |
char(1 байт) | signed unsined |
Первый бит рассматривается, как знаковый, остальные 7 определяют значение Наибольшее значение 127.Значение от 0 до 255. Гарантия непринятия отрицательного значения |
char16_t(2 байта) | Значение от 0 до 65538. | |
char32_t(4 байта) | Значение от 0 до 4294967295. |
Для работы с расширенным набором символов используется, таких как Unicode, тип wchar_t (широкий символ, 16 бит в Windows, 32 ,бита в GNU/Linux , но может представляться и 8 битовым значением.
В стандарте С и С++ от 2011 года введены фиксированные символьные типы char16_t and char32_t для обеспечения недвусмысленного представления 16-битового и 32 битового преобразования Unicode форматов.
Урок 3.2. Переменные
3.2. Переменные
Понятие переменная аналогично общепринятым математическим понятиям. Например, если вычисляются значения точек графика функции у=2*sin(x)-5, то ясно, что 2 и 5 - это константы, а х и у переменные, так как в ходе вычислений х и у могут принимать различные значения.
Переменная - это некоторая величина, которая в ходе выполнения программы может принимать различные значения |
Для переменных программист должен установить свои собственные символические обозначения, которые называются идентификаторами. Часто идентификаторы называют символическими именами или просто именами.
Урок 3.1. Константы
3.1. Константы
Как видно из приведенного примера в разделе 2, в программе на Си в явном виде записаны различные числовые и текстовые значения. Такие значения, появляющиеся в программе, принято называть константами.
Константа - это числовое или текстовое значение, которое всегда определено и в ходе выполнения программы не может изменяться. |
Тип константы определяется формой ее записи, а значение заключено в ней самой.
Урок 3.1.2. Вещественные константы
3.1.2. Вещественные константы
Вещественные константы представляют собой десятичные дробные
числа и могут быть записаны в двух формах:
- форма с точкой;
- форма с порядком.
Вещественная константа в форме с точкой записывается как десятичная дробь со знаком или без, в которой целая и дробная части отделяются десятичной точкой. Точка в записи константы обязательна, а цифры, образующие одну из ее частей (целую или дробную), могут отсутствовать:
<целая_ часть>.<дробная часть>
Если знак константы опущен, то она положительна. Примеры записи вещественных констант в форме с точкой:
- 560.23 + 384. 62.4 0.8 .01
Обратим внимание на то, что целое десятичное число может быть записано в виде вещественной константы, например, 5.0 . Вещественная константа в форме с порядком удобна для записи очень больших или очень малых чисел. Известно, что любое число можно записать в виде произведения на основание системы счисления в n-ой степени, например:
В Си, как впрочем и в большинстве других языков программирования, для таких записей используются вещественные константы в форме с порядком, имеющие вид:
< мантисса>Е <порядок> или <мантисса>е<порядок>
В этих обозначениях в качестве мантисса может быть записана либо десятичная константа без модификатора, либо вещественная константа в форме с точкой. В качестве порядок записывается целая десятичная константа, возможно со знаком, определяющая степень числа 10. Если знак порядка опущен, то подразумевается знак + . Примеры записи вещественных констант в форме с порядком: Запись в форме Десятичное с порядком значение
0.653412Е3 653,412
- 3.73Е -1 -0,373
+ 64.2е +02 6420,0
- 87Е2 -8700,0
.123е3 123
4037е -5 0,04037
Вещественные константы в форме с точкой и вещественные константы в форме с порядком имеют машинное представление характерное для нормализованных чисел с плавающей точкой и имеют тип double (двойная точность), занимая в памяти 8 байт для диапазона значений приблизительно от 1.7е-308 до 1.7е+308. Однако, если вещественная константа лежит в диапазоне от 3.4е-4931 до 1.1е+4931, то компилятор выделяет для ее машинного представления 10 байт памяти и она имеет тип long double (длинная двойная точность).
Программист имеет возможность явно указать компилятору сколько байт выделить для представления вещественной константы: Если к константе приписан модификатор L или l, то выделяется 10 байт независимо от значения вещественной константы. Например, 5.25L и 8.074e+32L Если к константе приписан модификатор F или f, то она имеет тип float (плавающий) и ей выделяется 4 байта, но при этом допустимый диапазон константы от 3.4е-38 до 3.4е+38. Например, 5.3F и 1.7e-6f
Компилятор Си к вещественным константам относится не "очень строго". Например, целую часть вещественной константы в форме с точкой можно записать восьмеричными или шестнадцатеричными цифрами. Компилятор не фиксирует ошибку, однако истинное машинное значение константы в этом случае не предсказуемо. Аналогично для константы в форме с точкой мантиссу и порядок можно задать восьмеричными целыми константами, но порядок компилятором воспринимается как десятичный. Поэтому советуем пользоваться только десятичными вещественными константами.
Таблица 4.2 характеризует вещественные константы.
Тип | Диапазон значений | Память (байты) | Число значащих цифр |
float | 3.4е-38 до 3.4е+38 | 4 | 5 - 6 |
double | 1.7е-308 до 1.7е+308 | 8 | 15 |
long double | 3.4е-4931 до 1.1е+4931 | 10 | 19 |