
2 Объекты данных и их свойства
Часто при первоначальном знакомстве с языками программирования проявляется тенденция сосредоточивать внимание на действиях: операторах или командах. Только изучив и опробовав операторы языка, мы обращаемся к изучению поддержки, которую обеспечивает язык для структурирования данных. В современных взглядах на программирование, особенно на объектно-ориентированное, операторы считаются средствами манипулирования данными, использующимися для представления некоторого объекта.
Объект данных это один или несколько однотипных элементов данных, объединенных в одно целое, имеющее конкретное представление в памяти компьютера в некоторый момент выполнения программы. Объект данных представляет собой контейнер для хранения значений данных.
Значение данных определяет конкретное представление объекта данных и может быть выражено числом, символом или литералом. Внутри компьютера значение представляется конкретной строкой битов. Например, символьное значение, обозначенное ‘x’, может представляться строкой из восьми битов 01111000.
Конкретное значение, заданное в программе «буквально», в виде последовательности символов, например 154, 45.6, FALSE, V, "Hello world", принято называть литералом.
Основными объектами данных процедурных языков программирования являются переменные и константы.
Переменные и константы.
Переменная – это поименованная область памяти, значение которой может изменяться в процессе выполнения программы.
Переменная – элементарный объект данных имеющий имя, присвоенное ячейке или ячейкам памяти, содержащим представление значения конкретного типа, которые может изменяться во время выполнения программы.
Переменные должны иметь имена, быть описанными по типу, классу памяти и иметь определенную область действия и время жизни.
В зависимости от области действия и времени жизни переменные бывают: автоматические, внешние, статические и регистровые
Автоматические переменные.
Автоматические(локальные) переменные являются внутренними или локальными по отношению к той функции, где они описаны и никакая другая функция не имеет к ним прямого доступа. Каждая локальная переменная существует только тогда, когда произошло обращение к соответствующей функции, и исчезает, как только закончится выполнение этой функции. По этой причине такие переменные, следуя терминологии других языков, обычно называют автоматическими.
Поскольку автоматические переменные появляются и исчезают вместе с обращением к функции, они не сохраняют своих значений в промежутке от одного вызова до другого, в силу чего им при каждом вводе нужно явно присваивать значения. Если этого не сделать, то они будут содержать “мусор”.
Внешние переменные.
В качестве альтернативы к автоматическим переменным можно определить переменные, которые будут внешними для всех функций, т.е. глобальными переменными, к которым может обращаться по имени любая функция, которая пожелает это сделать. (этот механизм весьма сходен с "common" в Фортране и "external" в PL/1).
В силу своей глобальной доступности внешние переменные предоставляют другую, отличную от аргументов и возвращаемых значений, возможность для обмена данными между функциями. Если имя внешней переменной каким-либо образом описано, то любая функция имеет доступ к этой переменной, ссылаясь к ней по этому имени.
В случаях, когда связь между функциями осуществляется с помощью большого числа переменных, внешние переменные оказываются более удобными и эффективными, чем использование длинных списков аргументов. Это соображение следует использовать с определенной осторожностью, так как оно может плохо отразиться на структуре программ и приводить к программам с большим числом связей по данным между функциями.
Вторая причина использования внешних переменных связана с инициализацией. В частности, внешние массивы могут быть инициализированы, а автоматические нет.
Третья причина использования внешних переменных обусловлена их областью действия и временем существования. Автоматические переменные являются внутренними по отношению к функциям; они возникают при входе в функцию и исчезают при выходе из нее. Внешние переменные, напротив, существуют постоянно. Они не появляются и не исчезают, так что могут сохранять свои значения в период от одного обращения к функции до другого. В силу этого, если две функции используют некоторые общие данные, причем ни одна из них не обращается к другой, то часто наиболее удобным оказывается хранить эти общие данные в виде внешних переменных, а не передавать их в функцию и обратно с помощью аргументов.
Внешняя переменная должна быть определена вне всех функций; при этом ей выделяется фактическое место в памяти. Такая переменная должна быть также описана в каждой функции, которая собирается ее использовать; это можно сделать либо явным описанием extern, либо неявным по контексту.
Статические переменные.
Статические переменные представляют собой третий класс памяти. Статические переменные могут быть либо внутренними, либо внешними. Внутренние статические переменные точно так же, как и автоматические, являются локальными для некоторой функции, но, в отличие от автоматических, они остаются существовать, а не появляются и исчезают вместе с обращением к этой функции. Это означает, что внутренние статические переменные обеспечивают постоянное, недоступное извне хранение внутри функции. Символьные строки, появляющиеся внутри функции, как, например, аргументы printf, являются внутренними статическими.
Внешние статические переменные определены в остальной части того исходного файла, в котором они описаны, но не в каком-либо другом файле.
Регистровые переменные.
Четвертый и особый класс памяти называется регистровым. Описание register указывает компилятору, что данная переменная будет часто использоваться. Когда это возможно, переменные, описанные как register, располагаются в машинных регистрах, что может привести к меньшим по размеру и более быстрым программам.
Константы
Константа – это поименованная область памяти, значение которой не может изменяться в процессе выполнения программы.
Константа является объектом данных с именем, присвоенным ячейке или ячейкам памяти, содержащим представление значения конкретного типа, которые не может быть изменено во время выполнения программы.
Константами также являются перечисление величин в программе.
Объекты данных(переменные и константы) имеют определенные атрибуты, среди которых можно выделить.
Тип – это атрибут , который ассоциирует объект данных с множеством значений и операций.
Класс памяти – характеризует порядок размещения объекта в памяти.
Имя – атрибут, позволяющий обращаться к объекты данных и как правило хранимый адрес местоположения данных в памяти компьютера.
Типы данных.
Программы на машинном языке (языке ассемблера) можно рассматривать как описания действий, которые должны быть выполнены над физическими сущностями, такими как ячейки памяти и регистры. Ранние языки программирования продолжили эту традицию идентифицировать сущности языка, подобные переменным, как слова памяти, несмотря на то, что этим переменным приписывались математические атрибуты типа целое. Поэтому int и float – это не математическое, а скорее, физическое представление памяти.
Таким образом, центральной концепцией программирования является тип.
Тип – это множество значений и множество операций над этими значениями.
Например, правильный смысл int в языке С таков: int — это тип, состоящий из конечного множества значений (в количестве примерно 65000 или 4 миллиардов, в зависимости от компьютера) и набора операций (обозначенных +, < =, и т.д.) над этими значениями.
В языке Си разделяют четыре типа констант: целые константы, константы с плавающей запятой, символьные константы и строковыми литералы.
Целая константа: это десятичное, восьмеричное или шестнадцатеричное число, которое представляет целую величину в одной из следующих форм: десятичной, восьмеричной или шестнадцатеричной.
Десятичная константа состоит из одной или нескольких десятичных цифр, причем первая цифра не должна быть нулем (в противном случае число будет воспринято как восьмеричное).
Восьмеричная константа состоит из обязательного нуля и одной или нескольких восьмеричных цифр (среди цифр должны отсутствовать восьмерка и девятка, так как эти цифры не входят в восьмеричную систему счисления). Например, 020, 0437.
Шестнадцатеричная константа начинается с обязательной последовательности 0х или 0Х и содержит одну или несколько шестнадцатеричных цифр (цифры представляющие собой набор цифр шестнадцатеричной системы счисления: 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F) Например, 0х234, 0х5ВА7.
Символьная константа - представляется символом заключенным в апострофы. Управляющая последовательность рассматривается как одиночный символ, допустимо ее использовать в символьных константах. Значением символьной константы является числовой код символа. Примеры:
' '- пробел , 'Q'- буква Q , '\n' - символ новой строки ,
'\\' - обратная дробная черта , '\v' - вертикальная табуляция .
Строковая константа (литерал) - последовательность символов (включая строковые и прописные буквы русского и латинского алфавита, а также цифры) заключенные в кавычки (") . Например: "Школа N 35", "город Тамбов", "YZPT КОД".
Все управляющие символы, кавычка ("), обратная дробная черта (\) и символ новой строки в строковом литерале и в символьной константе представляются соответствующими управляющими последовательностями. Каждая управляющая последовательность представляется как один символ. Например, при печати литерала "Школа \n N 35" его часть "Школа" будет напечатана на одной строке, а вторая часть "N 35" на следующей строке.
Следует отметить, что в строковых константах всегда обязательно задавать все три цифры в управляющей последовательности. Например, отдельную управляющую последовательность \n (переход на новую строку) можно представить как \010 или \xA, но в строковых константах необходимо задавать все три цифры, в противном случае символ или символы, следующие за управляющей последовательностью, будут рассматриваться как ее недостающая часть.
Например:
"ABCDE\x009FGH" данная строковая константа будет напечатана с использованием определенных функций языка Си, как два слова ABCDE FGH, разделенные 8-ю пробелами, в этом случае если указать неполную управляющую строку "ABCDE\x09FGH", то на печати появится ABCDE=+=GH, так как компилятор воспримет последовательность \x09F как символ "=+=".
Символы строкового литерала сохраняются в области оперативной памяти. В конец каждого строкового литерала компилятором добавляется нулевой символ, представляемый управляющей последовательностью \0.
Все строковые литералы рассматриваются компилятором как различные объекты. Строковые литералы могут располагаться на нескольких строках. Такие литералы формируются на основе использования обратной дробной черты и клавиши ввод. Обратная черта с символом новой строки игнорируется компилятором, что приводит к тому, что следующая строка является продолжением предыдущей. Например:
"строка неопределенной \n
длины"
полностью идентична литералу
"строка неопределенной длины".
Для сцепления строковых литералов можно использовать символ (или символы) пробела. Если в программе встречаются два или более строковых литерала, разделенные только пробелами, то они будут рассматриваться как одна символьная строка. Этот принцип можно использовать для формирования строковых литералов занимающих более одной строки.
Класс памяти.
Класс памяти определяет порядок размещения объекта в памяти. Различают автоматический и статический классы памяти. Например, C++ располагает четырьмя спецификаторами класса памяти:
auto register static extern
по два для обозначения принадлежности к автоматическому и статическому классам памяти.
В свою очередь, статический класс памяти может быть локальным (внутренним) или глобальным (внешним).
Таким образом, класс памяти определяет определенную область действия и время жизни объектов данных. Область действия это та часть программы, в которой имеется возможность обратиться к данным. Время жизни объектов данных определяется временем существования данных в процессе выполнения программы.
Имя объекта
Имя объекта данных представляет собой уникальный идентификатор, предназначенный для использования данных в программе. Имена(идентификаторы) объектов данных составляются из букв и цифр, первый символ должен быть буквой или допустимым символом. Рекомендуется выбирать имена переменных таким образом, чтобы они означали существо или назначение хранимых данных и были различимы при написании.