1.4 Типы данных.
Наша первая программа была
довольно простой и следующий пример ненамного
сложнее. Мы вычисляем сумму трёх чисел. Что здесь
появилось нового? Параллельно рассмотрим такую
же программу на Паскале.

В программе на Си, с помощью
оператора описания мы объявляем, что будем
использовать в программе переменные с именами a,
b, c и sum, которые принимают целые (int) значения. То же самое мы делаем в
программе на Паскале, используя ключевое слово
integer в разделе описания
переменных.
Слово int
служит ключевым словом, определяющим один из
основных типов данных языка Си. Ключевыми
словами называются специально
зарезервированные слова, используемые для
построения фраз языка. В языке Си все переменные
должны быть объявлены. Это означает, что,
во-первых, в начале каждой программы или функции
Вы должны привести список всех используемых
переменных, а во-вторых, указать тип каждой из
них.
a=1; - оператор присваивания.
Этот оператор служит для присваивания
переменной a значения 1. Как Вы должны знать в Паскале роль
оператора присваивания играет знак “:=”. Аналогично, операторы b=3; и c=5; служат
для присваивания переменным b и c значений 3 и 5 соответственно.
Оператор sum=a+b+c; также
является оператором присваивания. Смысл этого
оператора заключается в следующем: взять
значения переменных a, b и c,
просуммировать их и присвоить результат
переменной sum. Обратите
внимание на наличие в конце строк нашей
программы символа ; (точка
с запятой), именно этот символ указывает на конец
оператора.
Так же как и на Паскале функции writeln(), так и функции printf на Си, передаются два аргумента,
заключённые в круглые скобки. Первый аргумент
содержит символы, которые будут выводиться как
обычный текст и “спецификацию преобразования” %d. Вторым аргументом функции является
переменная sum, чьё
значение будет выведено на печать вместо
спецификации преобразования %d.
Как Вы уже заметили, программа в
своей работе имеет дело с данными. Некоторые
данные устанавливаются ещё до того, как
программа начнёт выполняться, а после её запуска
сохраняют такие значения неизменными на всём
протяжении работы программы. Это константы.
Другие данные могут изменяться во время
выполнения программы. Они называются переменными.

Различие между переменной и
константой довольно очевидно: во время
выполнения программы значение переменной может
быть изменено, а значение константы – нет.
Под переменной мы будем
понимать ячейку, куда компьютер может записывать
данные. Термин ячейка взят из обихода, однако,
фактически он совершенно точен. Под ячейкой мы в
действительности подразумеваем кусочек
памяти, в котором хранится информация. Чтобы
воспользоваться информацией, хранящейся в
ячейках, нужно, чтобы каждая ячейка имела своё имя
или, как часто говорят, - идентификатор.

Хорошим стилем является
осмысленное обозначение переменных. Имя
переменной может содержать от одного до 32
символов. Для образования имени переменной
разрешается использовать строчные и прописные буквы,
цифры и символ подчёркивания, который в Си
считается буквой. Первым символом должна быть
обязательно буква.

Помимо различия между
переменными и константами существует еще
различие между типами данных.
В языке Си предусмотрено
использование нескольких основных типов данных.
Тип константы компилятор может узнать по её виду.
Тип переменной необходимо объявить в операторе
описания. Оператор
описания состоит из спецификации типа и списка
имён переменных, разделённых запятой. В конце
обязательно должна стоять точка с запятой.
Давайте сравним, как делается описание величин
на Паскале и на Си. Предварительно напомним, что
на Паскале, описание переменных делается в
разделе описания переменных var, а на Си описать переменную можно в
любом месте программы, главное – до её
использования.
| Спецификация
типа |
Список имён
переменных |
Список имён
переменных |
Спецификация
типа |
| Int Char
Float
long int |
erest; response, intable;
noah, jonah;
students, players; |
erest: response, intable:
noah, jonah:
students, players: |
integer; char;
real;
longint; |
Спецификация типа
формируется из одного или более ключевых слов.
В стандарте языка Си используется семь ключевых
слов, указывающих на различные типы данных.
Посмотрим их в сравнении с соответствующими
типами языка Паскаль.

При объявлении переменной
компилятор отводит ей место в памяти в
зависимости от её типа. Рассмотрим подробнее
каждый из типов.
int (целый) – задаёт значения,
к которым относятся все целые числа, например –6,
0, 28 и т.д. для 16-ти разрядных ПЭВМ диапазон
возможных целых значений лежит в пределах от
–32768 до 32767. Обычно в Си, переменная типа int, занимает 16 бит.
short (короткий целый) –
соответствующие объекты не могут быть больше,
чем int. В Си переменная short, как и int,
занимает 16 бит.
long (длинный целый) –
соответствующие объекты не могут быть меньше,
чем int. В Си переменная
этого типа занимает 32 бита и позволяет
представить целые числа от –2147483648 до 2147483647.
Все данные этих типов являются
числами со знаком, т.е. допустимыми
значениями переменных этих типов могут быть
целые числа – положительные, отрицательные и
ноль.
Переменные типа unsigned (беззнаковый) могут принимать
только положительные значения и нуль.
Можно использовать комбинации
ключевых слов unsigned int или unsigned
long как обозначения типов целое
без знака и длинное целое без знака,
соответственно.
Тип данных char (символьный) определяет целые числа
без знака в диапазоне от 0 до 255. Обычно такое
целое размещается в одном байте памяти. Этот тип
данных используется для кодирования символов в
компьютере. Каждому числу в диапазоне от 0 до 255
ставится в соответствие символ из таблицы кодов
ASCII. Переменная этого типа занимает 8 бит.
Следует отметить, что, как и на
Паскале, два оператора присваивания: ch1=65; и ch2=’A’; приводят
к одному и тому же результату – переменным будет
присвоено значение 65.
float (вещественный) - задаёт
значения, к которым относятся вещественные
числа, имеющие дробную часть, отделяемую точкой
(например, -5.27, 0.0, 31.69 и т.д.). Вещественные числа
могут быть записаны также в форме с плавающей
точкой.
Наиболее общая форма записи
числа с плавающей точкой – это
последовательность десятичных цифр со знаком,
включающая в себя десятичную точку, затем
символ е или Е, и показатель степени
по основанию 10 со знаком. Знак + можно не писать. Разрешается также
опускать либо десятичную точку, либо
экспоненциальную часть, но не всё сразу. Кроме
того, можно не писать дробную или целую часть.
Данная переменная занимает 32 бита и может
принимать значения в диапазоне от -1.7е-308 до 1.7е+308.
double (двойная точность) –
определяет вещественные переменные, занимающие
в два раза больше места, чем переменная типа float. В Си переменная типа double занимает 64 бита. Она может принимать
значения в диапазоне -1.7е-308 до 1.7е+308.
enum (перечисляемый) –
предназначен для описания объектов из
некоторого заданного множества, например: {ВЕСНА,
ЛЕТО, ОСЕНЬ, ЗИМА}. С целью лучшего усвоения этого
типа данных рассматриваем его в сравнении с
типом set of из языка
Паскаль. Рассмотрим пример использования
данного типа.
Пусть идентификатор Seasons может принимать одно из четырёх
приведенных выше значений (эти значения
представляют собой константы). Тогда можно
записать следующее объявление:

Теперь можно объявить
переменные перечисляемого типа. Например:

Каждая из трёх переменных (a,
b, c) может принять одно из четырёх
значений: ВЕСНА, ЛЕТО, ОСЕНЬ, ЗИМА.
В принципе, можно сделать и
такую запись:

Как видно из приведённого
примера, объявление перечисляемого типа сильно
отличается от объявления в Паскале.
В отличие от языка Паскаль, в
языке Си существует несколько
труднопредставимых или невидимых символов, для
записи которых используется обратная косая
черта.
Невидимые и
труднопредставимые символьные константы:
\n новая строка
\b на одну позицию влево
\a короткий звуковой сигнал
\t горизонтальная табуляция
\v вертикальная табуляция
\b шаг назад
\r возврат каретки
\f подача бланка
\\ обратная косая черта (\)
\’ апостроф (‘)
\” кавычки (“)
Заметим, что несмотря на более
длинную запись, эти данные являются символьными,
и могут без всяких затруднений присваиваться
переменным типа char: ch=’\n’;
В заключении следует отметить,
что оператор описания
позволяет не только описать, но инициализировать
переменные (присвоить им начальные значения).
Аналогом этому в Паскале может служить типизированная
константа, когда константа выполняет роль
переменной с начальным значением. Например: const
cows:integer=42;.
Вот примерное описание величин
Си:

В последней строке программы на
Си, инициализируется только переменная cats. При невнимательном чтении может
создаться впечатление, что переменной dogs тоже присваивается значение равное
42, поэтому лучше избегать смешивания
инициализируемых переменных в одном операторе
описания, т.е. лучше сделать так:
short dogs;
short cats=42;
Как видно работа с описанием
величин на Си намного проще и не требует
специальных разделов для описания, как это
делается на Паскале. О том, из каких разделов
состоит программа на Си, и чем они отличаются от
разделов описания на Паскале, мы поговорим чуть
позже. |