Urok3

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-ой степени, например:

2 500 000 = 2,5 * 10^6
0,0000025 = 2,5 * 10^-6

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

< мантисса>Е <порядок> или <мантисса>е<порядок>

В этих обозначениях в качестве мантисса  может быть записана либо десятичная константа без модификатора, либо вещественная константа в форме с точкой. В качестве порядок записывается целая десятичная константа, возможно со знаком, определяющая степень числа 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

Translate Переводчик

Подписка на новости

SmartResponder.ru
Ваш e-mail: *
Ваше имя: *

Хостинг для Wordpress сайтов