ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 13.12.2020
Просмотров: 4233
Скачиваний: 28
Часть I. Язык программирования С
36
ратор присваивания, который в языке программирования C обо-
значается символом
=
. При этом в правой части оператора при-
сваивания пишется выражение, которое включает константы или
уже проинициализированные переменные. Язык программирова-
ния C допускает присваивание переменной значения, тип которо-
го отличается от типа переменной. В этом случае выполняется
неявное преобразование типов. Но об этом будет рассказано в
следующем разделе. А теперь покажем, как инициализируются
переменные.
float f = 3.14f;
double d = 3.14, g = f;
int i, j = 10, k = j + 5;
В заключение этого раздела отметим, что нужно придерживаться
следующего правила: все объявляемые переменные должны быть
инициализированы. Следование этому правилу упрощает отладку
программы.
2.5. Фундаментальные типы данных
Как уже говорилось в предыдущем разделе, язык программиро-
вания C допускает преобразование типов данных. Для упрощения
терминологии, связанной с этим вопросом, встроенные в язык
программирования C фундаментальные типы данных разбивают-
ся на три группы: интегральный тип, тип с плавающей точкой и
пустой тип.
Интегральный
тип данных содержит все типы, спецификатор ко-
торых содержит хотя бы одно из ключевых слов
char
,
short
,
int
или
long
, исключая тип
long
double
. Другими словами можно ска-
зать, что интегральный тип содержит символьный и все целочис-
ленные типы данных языка программирования С. Слово "инте-
гральный" говорит о том, что каждый из типов, входящих в эту
группу, содержит непрерывное множество значений.
Тип данных с
плавающей точкой
содержит типы
float
,
double
и
long double
. В отличие от интегрального типа множество значе-
ний любого типа с плавающей точкой не является непрерывным.
Глава 2. Встроенные типы данных и переменные
37
Иногда тип с плавающей точкой называют просто
плавающим
типом.
Пустой
тип данных содержит только тип данных
void
, который в
свою очередь не содержит ни одного значения.
Интегральный тип и тип данных с плавающей точкой объединя-
ются в
арифметический
или
числовой
тип данных.
2.6. Квалификаторы типов
Квалификатор
типа данных это ключевое слово, которое управ-
ляет доступом к переменной. Поэтому квалификаторы типов
также иногда называются
модификаторами доступа
. В языке
программирования C существует два квалификатора типов:
const
и
volatile
. Квалификатор типа может использоваться как перед
спецификатором типа, так и после него.
Квалификатор
const
говорит компилятору о том, что идентифи-
катор является именем константы. Поэтому такую константу час-
то также называют
именованной константой
. Значение имено-
ванной константы нельзя изменить. При этом заметим, что име-
нованная константа всегда должна быть инициализирована при
своем объявлении. Приведем пример объявления именованной
константы.
const int i = 1;
Константа именуется для упрощения модификации программы
в случае изменения значения этой константы.
Квалификатор
volatile
говорит компилятору о том, что значение
переменной может быть изменено при исполнении кода, который
не принадлежит программе, в которой объявлена переменная.
Например, программой обработки некоторого сигнала. Использо-
вание квалификатора
volatile
гарантирует, что все программы
обратятся к одной и той же переменной. Если в таких случаях не
использовать квалификатор
volatile
, то может возникнуть сле-
дующая ситуация. Компилятор может оптимизировать код и по-
местить в одной программе значение переменной в регистр, а в
другой — в какую-то область памяти. В результате разные про-
Часть I. Язык программирования С
38
граммы фактически будут обращаться к разным переменным.
Поэтому переменные, объявленные с квалификатором
volatile
,
всегда хранятся в памяти. Учитывая вышесказанное, такие пере-
менные часто также называют
нестабильными
или
изменчивыми
переменными. Приведем пример объявления нестабильной пере-
менной:
volatile int i = 1;
Отметим, что допустимо совместное использование квалифика-
торов
const
и
volatile
. Например:
volatile const int i = 1;
В этом случае именованная константа определяет область памя-
ти, содержимое которой не может быть изменено внутри про-
граммы, но может быть изменено другой программой.
Г Л А В А
3
Операторы и выражения
3.1. L-value и R-value
Данные в языке программирования C могут представляться лите-
ралами и переменными. И те и другие хранят значения данных в
областях памяти. Это хранимое значение данных называется
R-value, что является сокращением от английского названия read
value — т. е. значение, которое можно прочитать. Фундаменталь-
ное различие между литералами и переменными заключается в
том, что переменная именует область памяти, в которой хранится
R-value (т. е. фактически переменная представляет адрес этой об-
ласти), а литерал — нет. Значение адреса области памяти для
хранения значения переменной называется L-value, что является
сокращением от английского названия location value, т. е. значе-
ние, которое определяет местоположение. Таким образом, пере-
менная определяет как R-value, так и L-value, а литерал определя-
ет только R-value.
Понятия L-value и R-value вводятся для того, чтобы точнее опре-
делить, какие значения могут быть операндами операторов и ка-
кое значение получается в результате выполнения оператора. Так
как L-value определяет адрес, то по этому адресу может быть за-
писано новое значение переменной. Литерал же не может полу-
чить нового значения. Однако отметим, что если L-value пред-
ставляет именованную константу, то по этому адресу также не
может быть записано новое значение данных. Говорят, что
Часть I. Язык программирования С
40
L-value является
модифицируемым
, если по адресу, определяе-
мому этим значением, может быть записано новое значение
данных.
3.2. Арифметические операторы
Над данными арифметического типа определены следующие
унарные
операторы:
+
— знак числа не изменяется;
-
— изменение знака числа на противоположный знак.
И
бинарные
операторы (которые также называются
арифме-
тическими
):
+
— сложение двух чисел;
-
— вычитание двух чисел;
*
— умножение двух чисел;
/
— деление двух чисел.
При этом отметим, что если оператор деления выполняется над
данными интегрального типа, то результатом является частное от
деления.
Например, над двумя целыми числами можно выполнить сле-
дующие арифметические операторы:
int x = 1, y = 2, z;
z = + x; /* z = 1 */
z = x + y; /* z = 3 */
z = - x; /* z = -1 */
z = x – y; /* z = -1 */
z = x * y; /* z = 2 */
z = x / y; /* z = 0 */
Над данными интегрального типа также определен бинарный
арифметический оператор:
%
— деления двух чисел по модулю, который дает в результате
остаток от деления.