Urok3_1

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.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

Урок 3.1.1. Целые константы

3.1.1. Целые константы

Целая константа - это число, записанное в программе без десятичной точки и без показателя степени. Целые константы в Си могут быть:

-         десятичными;
-         восьмеричными;
-         шестнадцатеричными.

Систему счисления константы компилятор распознает по форме ее записи следующим образом:

Если константа записана цифрами 0 - 9 и первая цифра не 0, то константа десятичная. Например, 45 и 37. Если константа записана цифрами 0 - 7 и первая цифра 0, то константа восьмеричная. Например, 045 и 037. Если константа записана цифрами 0 - 9, буквами A - F или a - f и начинается с 0Х или 0х, то константа шестнадцатеричная. Например, 0Х45 и 0х37.

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

В зависимости от значения константы и от архитектуры компьютера компилятор выделяет для ее машинного представления 2 или 4 байта памяти. На современных компьютерах вы вряд ли увидите 2 байта для целых констант. Для хранения целых типов выделяется 4 байта. Для того, чтобы узнать сколько байт занимает константа или переменная можно использовать операцию sizeof (Урок 4.7. Операция размер). Например, sizeof(25)  даст 4, а sizeof (7984222238294967284) - 8, т.к. тип этой константы long long int.

Для значений от -32768 до 32 767 выделяется 2 байта, в которых первый бит интерпретируется как знак константы, а оставшиеся 15 битов определяют ее значение. В этом случае константа имеет тип int (целый).

Для значений от 0 до 65 535 также выделяется два байта памяти, но уже все 16 бит определяют значение константы. Такая константа имеет тип unsigned int (беззнаковый целый). Константы этого диапазона, записанные со знаком минус, рассматриваются как беззнаковые к которым применяется операция "унарный минус".

Для значений от-2 147483 648 до 2 147 483 647 выделяется 4 байта, в которых первый бит интерпретируется как знак, а оставшиеся 31 бит, как значение числа. Такие константы имеют тип long (длинный).

Для значений от 0 до 4 294 967 295 выделяются 4 байта, в которых все 32 бита интерпретируются как значение. Такая константа имеет тип unsigned long (беззнаковый длинный). Для этого типа к отрицательным константам также применяется операция "унарный минус".

Аналогично выделяется память для восьмеричных и шестнадцатеричных констант, лежащих в соответствующем десятичном диапазоне. Константы, имеющие запись в программе в виде числа больше чем 4 294 967 295 вызывают переполнение однако компилятор не дает предупреждений, а в память записывает младшие биты усеченной константы.

Программист имеет возможность явно указать компилятору, что для какой-либо константы необходимо выделить 4 байта и указать их интерпретацию, как беззнаковую (unsigned). Для этого необходимо использовать соответствующие модификаторы, приписываемые после младшей цифры константы.

Для того чтобы указать, что константа имеет тип long нужно дописать модификатор L или I (допускается также l или i). Например, константы:

846L  054l  0x7A4Fl

будут занимать в памяти четыре байта и иметь тип long несмотря на то, что они по своему значению входят в двухбайтный диапазон int. Для того чтобы указать что константа беззнаковая необходимо дописать U или u. Например, константы: 846U  054U  0x7A4Fu будут занимать в памяти два байта (определяется компилятором по значению) и интерпретироваться как беззнаковые, т.е. будут иметь тип unsigned int. Одновременно в константе можно явно определить и long и unsigned, например так:

235lu  0578ul  0x5ul

Эти константы будут занимать в памяти по четыре байта и интерпретировать как беззнаковые, т.е. иметь тип unsigned long. Порядок дописывания модификаторов безразличен. Таблица 4.1. иллюстрирует типы, диапазоны значений и выделяемую компилятором память для представления целых констант. Ключевые слова в квадратных скобках необязательны  - их можно опускать при записи.

Таблица 4.1. Целые константы

Тип Диапазон значений Память (байты)
[signed] short [int] -32768 ÷ 32767 2
int
[signed] int
-2 147483 648 ÷ 2 147483 647 4
unsigned short [int] 0 ÷ 65535 2
unsigned [int] 0 ÷ 4294967295 4
long
[signed] long [int]
-2 147483 648 ÷ 2 147483 647 4
unsigned long
unsigned long [int]
0 ÷ 4 294 967 295 4
long long int
long long
-9223372036854775808  ÷ 9223372036854775807 8

Translate Переводчик

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

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

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