Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Язык C. Ч3.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
254.2 Кб
Скачать

Int main(void)

{

int i = 2147483647;

unsigned int j = 4294967295;

printf("%d %d %d\n", i, i+1, i+2);

printf("%u %u %u\n", j, j+1, j+2);

return 0;

}

В нашей системе был получен следующий результат:

2147483647 -2147483648 -2147483647 4294967295 0 1

Целочисленная переменная без знака j действует как счетчик пробега автомобиля. Когда достигается максимальное значение, оно сбрасывается, и подсчет начинается сначала. Целочисленная переменная i ведет себя аналогично. Главное различие между ними за­ключается в том, что значения переменной j типа unsigned int, подобно счетчику про­бега, начинаются с 0, в то время как значения переменной i типа int — с -2 147 483 648. Обратите внимание, что о превышении максимального значения (переполнении) перемен­ной i ничего не сообщается. Чтобы отслеживать это, вам придется самостоятельно предус­мотреть подходящий код.

Использование символов: тип char

Тип данных char применяется для хранения символов, таких как буквы и знаки препинания, однако формально он также является целочисленным. Почему? Причина в том, что тип char в действительности хранит целые числа, а не символы. Для под­держки символов компьютер использует числовой код, в котором определенные целые числа представляют определенные символы. В США наиболее часто применяется код ASCII, и он как раз принят в настоящей книге. К примеру, целое значе­ние 65 в нем представляет прописную букву А. Таким образом, чтобы сохранить букву А, фактически нужно записать целое число 65.

Стандартный код ASCII состоит из последовательности чисел от 0 до 127. Этот диапазон достаточно мал, чтобы для значения хватило 7 битов. Тип char обычно определяется как 8-битная единица памяти, поэтому ее более чем достаточно, что­бы уместить стандартный код ASCII.

Многие наборы символов содержат более 127 или даже 255 значений. Например, существует набор символов Japanese kanji для японских иероглифов. В рамках ком­мерческой инициативы Unicode был создана система для представления широкого разнообразия наборов символов, применяемых в различных частях мира, которая в настоящее время содержит более 110 ООО символов. Организация ISO и комиссия IF.C (International Electrotechnical Commission — Международная электротехническая комиссия) вместе разработали для наборов символов стандарт, получивший название ISO/IF.C 10646. К счастью, стандарт Unicode сохранил совместимость с более широ­ким стандартом ISO/IF.C 10646.

Язык С определяет байт как несколько битов, используемых типом char, поэтому может быть система с 16- или 32-битным байтом и типом char.

Объявление переменных типа char

Как и можно было ожидать, переменные типа char объявляются в такой же мане­ре, что и другие переменные. Вот несколько примеров:

char response;

char itable, latan;

В этом коде создаются три переменных типа char: response, itable и latan.

Символьные константы и инициализация

Предположим, что вы хотите инициализировать символьную константу буквой А. Компьютерные языки призваны облегчить решение этой задачи, так что вам не при­дется запоминать все коды ASCII. Вы можете присвоить символ А переменной grade с помощью следующей инициализации:

char grade = 'А' ;

Одиночный символ, заключенный в одиночные кавычки, представляет собой символьную константу в С. Когда компилятор встречает конструкцию ' А', он преоб­разует ее в подходящее кодовое значение. Одиночные кавычки здесь очень важны. Рассмотрим еще один пример:

char broiled; /* объявление переменной типа char */

broiled = "Г'; /* правильно */

broiled = Т; /*Неправильно! Компилятор считает, что Т является переменной */

broiled = "т"; /* Неправильно! Компилятор считает, что "Т" является строкой */

Если опустить кавычки, то компилятор посчитает, что Т является именем перемен­ной. Если применить двойные кавычки, он воспримет "Т" как строку.

Поскольку символы в действительности хранятся в виде числовых значений, для присваивания значений можно также указывать числовые коды:

char grade = 65; /* правильно в контексте ASCII, но стиль неудачен */

В данном примере 65 имеет тип int, но поскольку это значение меньше макси­мального значения типа char, оно может быть присвоено переменной grade без ка­ких-либо проблем. Так как 65 представляет собой ASCII-код буквы А, в этом примере переменной grade присваивается значение А. Тем не менее, обратите внимание, что в примере предполагается использование в системе кодировки ASCII. Указание 'А' вместо 6 5 дает в результате код, который работает в любой системе. Таким образом, применять символьные константы намного лучше, чем значения числовых кодов.

Непечатаемые символы

Прием с одиночными кавычками хорош для символов, цифр и знаков препинания, однако если просмотреть таблицу кодов ASCII, в ней можно обнаружить также непе­чатаемые символы. Например, некоторые из них представляют собой такие действия, как возврат на одну позицию влево, переход на следующую строку или выдачу звуко­вого сигнала терминалом либо встроенным динамиком. Как их можно представить? В языке С предлагаются три способа. Первый способ уже упоминался — применение ASCII-кода. Например, ASCII-кодом для символа звукового сигнала является 7, так что можно использовать следующий оператор:

char beep = 7;

Второй способ представления необычных символов в языке С предусматривает применение специальных последовательностей символов, которые называются управ­ляющими последовательностями. Список управляющих последовательностей и их описа­ние приведено в табл. 3.2.

Таблица 3.2. Управляющие последовательности

Последовательность

Описание

Предупреждение (стандарт ANSI С)

Возврат на одну позицию влево

\f

Перевод страницы

\п

Новая строка

\ г

Возврат каретки

\t

Горизонтальная табуляция

\v

Вертикальная табуляция

\\

Обратная косая черта (\)

V

Одиночная кавычка (1)

\"

Двойная кавычка (")

\?

Знак вопроса (?)

\0оо

Восьмеричное значение

\xhh

Шестнадцатеричное значение

Управляющие последовательности, присваиваемые символьным переменным, должны быть заключены в одиночные кавычки. Например, можно записать такой оператор:

char nerf = '\n';

а затем вывести переменную nerf, что обеспечит перемещение на следующую строку на принтере или на экране монитора.

Управляющие последовательности \b, \f, \n, \r, \t и \v представляют собой обычные символы управления выходным устройством. Их проще всего описывать в терминах того, как они влияют на активную позицию. Символ возврата на одну пози­цию влево (\b) перемещает активную позицию назад на один символ текущей строки. Символ перевода страницы (\f) переносит активную позицию в начало следующей страницы. Символ новой строки (\п) перемещает активную позицию в начало следу­ющей строки. Символ возврата каретки (\r) переносит активную позицию в начало текущей строки. Символ горизонтальной табуляции (\t) перемещает активную пози­цию в следующую точку горизонтальной табуляции (обычно эти точки находятся в позициях 1,9, 17, 25 и т.д.). Символ вертикальной табуляции (\v) переносит активную позицию в следующую точку вертикальной табуляции.

Следующие три управляющие последовательности (\\, \' и \") обеспечива­ют возможность использования символов \, ' и " в качестве символьных констант. (Поскольку эти символы служат для определения символьных констант как части ко­манды printf (), буквальное их указание может вызвать путаницу.) Предположим, что вы хотите вывести следующую строку:

Джо сказал: "символ \ является символом обратной косой черты."

Необходимо использовать такой код:

printf("Джо сказал: \"символ \\ является символом обратной косой черты.\"\n") ;

Печатаемые символы

Для указания на то, что должен быть выведен символ, в функции printf () исполь­зуется спецификатор %с. Вспомните, что символьная переменная хранится как одно­байтовое целочисленное значение. Следовательно, при выводе значения переменной типа char с обычным спецификатором %d будет получено целое число. Спецификатор формата %с сообщает функции printf () о необходимости отобразить символ с кодо­вым значением, равным этому целому числу. В листинге 3.5 приведен код, в котором переменная char выводится обоими способами.

Листинг 3.5. Программа charcode.c

/* charcode.c — отображает кодовое значение символа */

#include <stdio.h>