Опубликован: 14.12.2010 | Уровень: для всех | Доступ: платный
Лекция 3:

Переменные и базовые типы данных языка С

< Лекция 2 || Лекция 3: 1234 || Лекция 4 >
Аннотация: В лекции ставится задача изучения базовых типов и их размеров языка программирования С, объявления и программы с переменными, включая простейшие арифметические операции. В практической части рассматриваются примеры с их полной программной реализацией.

Теоретическая часть

Фундаментальные объекты данных, с которыми работает программа, – это переменные и константы [2.1]. Используемые в программе переменные перечисляются в объявлениях или декларациях, в которых указывается их тип, а также иногда их начальные значения.

С именами переменных связывается тип данных, который контролируется компилятором и для которого выделяется определенное количество байтов памяти [2.1]. Имена переменных должны начинаться с буквы (латинского алфавита) или символа подчеркивания (например, _aza ), за которым могут следовать любые комбинации букв в любом регистре (заглавные или строчные), символы подчеркивания или цифры 0–9. В языке С имеется различие между заглавными и строчными буквами. Поэтому переменная World будет отличаться от переменной world и т.п. При этом в определении переменной не разрешается символ пробела (пробелов) и некоторые другие символы, например, $... .

Стандарт С89 определяет пять базовых типов данных [2.4]:

intцелочисленный тип, целое число;

floatвещественное число одинарной точности с плавающей точкой;

doubleвещественное число двойной точности с плавающей точкой;

char – символьный тип для определения одного символа;

void – тип без значения.

Кроме того, существуют модификаторы, которые могут применяться к этим базовым типам [2.1]. Ряд компиляторов может поддерживать еще и логический тип _Bool. Тип void служит для объявления функции, не возвращающей значения, или для создания универсального указателя (pointer).

Объект типа char всегда занимает 1 байт памяти [2.4]. Размеры объектов других типов, как правило, зависят от среды программирования и операционной системы.

Приведем модификаторы базовых типов данных. К ним относятся следующие спецификаторы, предшествующие им в тексте программы [2.4]:

signed, unsigned, long, short

Базовый тип int может быть модифицирован каждым из перечисленных спецификаторов. Тип char модифицируется с помощью unsigned и signed, тип double – с помощью long.

В табл. 2.1 приведены допустимые комбинации типов данных языка С с их минимальным диапазоном значений и типичным размером [13].

Таблица 2.1.
Типы данных языка С
Тип данных Типичный размер в битах Минимально допустимый диапазон значений
char 8 (или 1 байт) от –128 до 127
unsigned char 8 от 0 до 255
signed char 8 от –128 до 127
int 16 или 32 от –32768 до 32767
unsigned int 16 или 32 от 0 до 65535
signed int 16 или 32 от –32767 до 32767
short int 16 от –32767 до 32767
unsigned short int 16 от 0 до 65535
signed short int 16 от –32767 до 32767
long int 32 от –2147483648 до 2147483647
long long int 64 от –(263–1 ) до (263–1) для С99
signed long int 32 от –2147483647 до 2147483647
unsigned long int 32 от 0 до 4294967295
unsigned long long int 64 от 0 до (264–1) для С99
float 32 от 1Е–37 до 1Е+37 (с точностью не менее 6 значащих десятичных цифр)
double 64 от 1Е–37 до 1Е+37 (с точностью не менее 10 значащих десятичных цифр)
long double 80 от 1Е–37 до 1Е+37 (с точностью не менее 10 значащих десятичных цифр)

Для базового типа int возможны следующие записи с модификатором:

signed  или  signed int
unsigned  или  unsigned int
long  или  long int
short  или  short int

Для данных вещественного типа максимальные значения абсолютных величин представлены в табл. 2.2 [2.4].

Таблица 2.2.
Вещественные типы данных языка С
Тип данных Типичный размер в битах Диапазон абсолютных величин
float 32 от 3.4Е–38 до 3.4Е+37
double 64 от 1.7Е–308 до 1.7Е+308
long double 80 от 3.4Е–4932 до 1.1Е+4932

В языке С предусматривается преобразование типов в выражениях и приведение типов. Если в выражении смешаны различные типы литералов и переменных, то компилятор преобразует их в один тип. Во-первых, все char и short int значения автоматически преобразуются (с расширением "типоразмера") в тип int. Этот процесс называется целочисленным расширением (integral promotion). Во-вторых, все операнды преобразуются (также с расширением "типоразмера") в тип самого большого операнда. Этот процесс называется расширением типа (type promotion), причем он выполняется пооперационно. Например, если один операнд имеет тип int, а другой– long int, то тип int расширяется в тип long int. Или если хотя бы один из операндов имеет тип double, то любой другой операнд приводится к типу double. Это означает, что такие преобразования, как тип char в тип double, вполне допустимы (если предусматривать, к чему это приведет). После преобразования оба операнда будут иметь один и тот же тип, а результат операции – тип, совпадающий с типом операндов. Приведем последовательность преобразования типов в выражениях по старшинству [2.4]:

ЕСЛИ  операнд имеет тип long double
ТО  второй операнд преобразуется в long double
ИНАЧЕ ЕСЛИ  операнд имеет тип double
ТО  второй операнд преобразуется в double
ИНАЧЕ ЕСЛИ  операнд имеет тип float
ТО  второй операнд преобразуется в float
ИНАЧЕ ЕСЛИ  операнд имеет тип unsigned long
ТО  второй операнд преобразуется в unsigned long
ИНАЧЕ ЕСЛИ  операнд имеет тип long
ТО  второй операнд преобразуется в long
ИНАЧЕ ЕСЛИ  операнд имеет тип unsigned int
ТО  второй операнд преобразуется в unsigned int

Кроме того, действует правило: если один из операндов имеет тип long, а второй– unsigned int, притом значение unsigned int не может быть представлено типом long, то оба операнда преобразуются в значение типа unsigned long.

В языке С предусматривается явное преобразование (приведение) типов. Общая форма оператора явного приведения типа: (тип) выражение.

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

В приводимых ниже программах используются такие средства ввода-вывода, как printf(), getchar(), gets(), scanf().

Приведем характеристику данных функций [2.4].

Прототип функции printf() имеет вид:

int printf(const char *format, ?);

Функция printf() записывает в стандартный поток stdout (стандартный выходной поток данных) значения аргументов из заданного списка аргументов в соответствии со строкой форматирования, адресуемой параметром format. Строка форматирования состоит из элементов двух типов. К элементам первого типа относятся символы, которые выводятся на экран. Элементы второго типа содержат спецификации формата, определяющий способ отображения аргументов. Спецификация формата начинается символом процента, за которым следует код формата. На спецификации формата могут воздействовать модификаторы, задающие ширину поля, точность и признак выравнивания по левому краю. Целое значение, расположенное между знаком % и командой форматирования, играет роль спецификации минимальной ширины поля. Наличие этого спецификатора приводит к тому, что результат будет заполнен пробелами или нулями, чтобы выводимое значение занимало поле, ширина которого не меньше заданной С І минимальной ширины. По умолчанию в качестве заполнителя используется пробел (пробелы). Для заполнения нулями перед спецификацией ширины поля нужно поместить нуль, т.е. 0. Например, спецификация формата %05d дополнит нулями выводимое целое число, в котором менее пяти цифр, чтобы общая длина равнялась пяти символам. Действие модификатора точности зависит от кода формата, к которому он применяется. Чтобы добавить модификатор точности, следует поставить за спецификатором ширины поля десятичную точку, а после нее – требуемое значение точности (число знаков после десятичной точки). Применительно к целым числам модификатор точности задает минимальное количество выводимых цифр. При необходимости перед целым числом будут добавлены нули. Если модификатор точности применяется к строкам, то число, следующее за точкой, задает максимальную длину поля. Например, спецификация %5.7s выведет строку длиной не менее пяти, но не более семи символов. Если выводимая строка окажется длиннее максимальной длины поля, конечные символы будут отсечены. По умолчанию все выводимые значения выравниваются по правому краю: если ширина поля больше выводимого значения, то оно будет выровнено по правому краю поля. Чтобы установить выравнивание по левому краю, нужно поставить знак "минус" ("–") сразу после знака процента. Например, спецификация формата %–10.4f обеспечит выравнивание вещественного числа с четырьмя десятичными знаками по левому краю в 10-символьном поле. Существуют два модификатора формата, позволяющие функции printf() отображать короткие и длинные целые числа. Это модификатор l (латинская буква эль) уведомляет функцию printf() о длинном типе значения. Модификатор h сообщает функции printf(), что нужно вывести число короткого целого типа. Кроме того, модификатор l можно поставить перед командами форматирования вещественных чисел. В этом случае он уведомит о выводе значения типа long double.

Спецификаторы формата для функции printf() перечислены в табл. 2.3, взятой из [2.3].

Таблица 2.3.
Спецификаторы формата функции printf()
Код Формат
%c Символ
%d Десятичное целое число со знаком
%i Десятичное целое число со знаком
%e Экспоненциальное представление числа (в виде мантиссы и порядка, е — на нижнем регистре)
%E Экспоненциальное представление числа (в виде мантиссы и порядка, Е — на верхнем регистре)
%f Десятичное число с плавающей точкой
%F Десятичное число с плавающей точкой (только стандарт С99; если применяется к бесконечности или нечисловому значению, то выдает надписи INF, INFINITY(бесконечность) или NAN — Not A Number на верхнем регистре. Спецификатор %f выводит их эквиваленты на нижнем регистре)
%g Использует более короткий из форматов %e или %f
%G Использует более короткий из форматов %E или %F
%o Восьмеричное число без знака
%s Символьная строка
%x Шестнадцатеричное без знака (строчные буквы)
%X Шестнадцатеричное без знака (прописные буквы)
%p Выводит указатель
%n Соответствующий аргумент должен быть указателем на целое число. (Этот спецификатор указывает, что в целочисленной переменной, на которую указывает ассоциированный с данным спецификатором указатель, будет храниться число символов, выведенных к моменту обработки спецификации %n)
%% Выводит знак процента
< Лекция 2 || Лекция 3: 1234 || Лекция 4 >
Мухаммадюсуф Курбонов
Мухаммадюсуф Курбонов
Александр Соболев
Александр Соболев
Россия
Артем Полутин
Артем Полутин
Россия, Саранск