Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Унарные арифметические операции




Нисходящее проектирование

Метод предполагает последовательное разложение функции обработки данных на простые функциональные элементы ("сверху вниз"). В результате строится иерархическая схема, которая отражает состав и взаимоподчиненность отдельных функций.

Она носит название функциональная структура алгоритма (ФСА) приложения, в которой отражаются:

· цели предметной области (цель-подцель);

· состав приложений (задач обработки), обеспечивающих реализацию поставленных целей;

· характер взаимосвязи приложений с их основными характеристиками;

· функции обработки данных.

Концепция модульного программирования

Так же как и для структурной технологии программирования, концепцию модульного программирования можно сформулировать в виде нескольких понятий и положений:

· Функциональная декомпозиция задачи - разбиение большой задачи на ряд более мелких, функционально самостоятельных подзадач - модулей. Модули связаны между собой только по входным и выходным данным.

· Модуль - основа концепции модульного программирования. Каждый модуль в функциональной декомпозиции представляет собой "черный ящик" с одним входом и одним выходом. Модульный подход позволяет безболезненно производить модернизацию программы в процессе ее эксплуатации и облегчает ее сопровождение. Дополнительно модульный подход позволяет разрабатывать части программ одного проекта на разных языках программирования, после чего с помощью компоновочных средств объединять их в единый загрузочный модуль.

· Реализуемые решения должны быть простыми и ясными. Если назначение модуля непонятно, то это говорит о том, что декомпозиция начальной или промежуточной задачи была проведена недостаточно качественно. В этом случае необходимо еще раз проанализировать задачу и, возможно, провести дополнительное разбиение на подзадачи. При наличии сложных мест в проекте их нужно подробнее документировать с помощью продуманной системы комментариев. Этот процесс нужно продолжать до тех пор, пока действительно не удастся добиться ясного понимания назначения всех модулей задачи и их оптимального сочетания.

· Назначение всех переменных модуля должно быть описано с помощью комментариев по мере их определения.

Объектно-ориентированное программирование (ООП)

Идея ООП заключается в стремлении связать данные с обрабатывающими эти данные процедурами в единое целое - объект. ООП основано на трех важнейших принципах, придающих объектам новые свойства.

Этими принципами являются инкапсуляция, наследование и полиморфизм.

· Инкапсуляция - объединение в единое целое данных и алгоритмов обработки этих данных. В рамках ООП данные называются полями объекта, а алгоритмы - объектными методами.

· Наследование - свойство объектов порождать своих «потомков». Объект - «потомок» автоматически наследует от «родителей» все поля и методы, может дополнять объекты новыми полями и заменять (перекрывать) методы «родителя» или дополнять их.

· Полиморфизм - свойство родственных объектов (т.е. объектов, имеющих одного общего «родителя») решать схожие по смыслу проблемы разными способами.

CASE-системы

Представление о CASE - комплексах связано в нашем сознании с чем-то, не имеющим отношения к обычному программированию. В Америке из-за сильнейшей конкуренции CASE-средства используются подавляющим большинством фирм - разработчиков программного обеспечения.

Мощный толчок CASE-средства получили в пору внедрения объектно-ориентированной технологии разработки ПО, когда старого, проверенного временем метода проектирования "сверху вниз" стало явно недостаточно. К тому же появились технологии объектного моделирования Booch, OMT, UML, сами по себе весьма сложные для привязки к языкам программирования, чтобы оперировать ими вручную.

Сегодня лидирующей в мире CASE-системой считается Rational Rose корпорации Rational Software. Система Rational Rose нацелена на создание модулей с использованием языка Unified Modeling Language (UML). Кстати, UML стал стандартным языком объектно-ориентированной разработки не без подачи Rational Software, которая не только выпускает программные продукты, где используются UML, но и активно принимает участие в организации Object Management Group (OMG), занятой созданием и обновлением спецификаций языка UML, технологии распределенных вычислений CORBA и т.д.

В компании Rational работают три создателя и евангелиста объектно-ориентированной разработки и языка UML. Это Гради Буч, Айвар Джекобсон и Джим Рамбаух. Последняя версия CASE-системы компании Rational Software Rational Rose 98 успешно применяется для создания коммерческого ПО и поддерживает популярные языки программирования Java, Си++, Смолток, Ада, Visual Basic, Power Builder и Forte. Кроме того, пакет Rose 98 способен генерировать описания на языках Interface Definition Language (IDL) для приложений CORBA и Data Definition Language (DDL) для приложений доступа к базам данных, в том числе и Oracle 8. Разумеется, поддержка того или иного языка программирования зависит от того, о какой редакции пакета Rational Rose 98 идет речь.

К примеру, нельзя требовать многого от самого простого варианта пакета - Rose 98 Modeler Edition. Зато Rose 98 Enterprise Edition оснащен от души. Нельзя не отметить, что система Rose - признанный лидер среди средств визуального моделирования, и, используя ее, можно интерактивно разрабатывать архитектуру создаваемого приложения, генерировать его исходные тексты и параллельно работать над документированием разрабатываемой системы. С помощью Rational Rose можно создавать новые модели на базе обратного разбора двоичных com модулей или исходные тексты прикладных программ и библиотек классов.

Преимущества от применения Rational Rose 98 значительны:

· Сокращение цикла разработки приложения.

· Увеличение продуктивности работы программистов.

· Улучшение потребительских качеств создаваемых программ за счет ориентации на пользователей и бизнес.

· Способность вести большие проекты и группы проектов.

· Возможность повторного использования уже созданного ПО за счет упора на разбор их архитектуры и компонентов.

· Язык UML служит универсальным "мостиком" между разработчиками из разных отделов. 

 

 

3. Общие сведения о программах, лексемах и алфавите языка C++ и 5. Константы: целые константы, вещественные константы, перечислимые константы, символьные (литерные константы).

Алфавит языка программирования С++ аналогичен алфавитам других языков программирования (Pascal, Basic и т.д.). Из символов алфавита формируются лексемы языка (лексема – последовательность символов, обрабатываемая компилятором):

  • идентификаторы;
  • ключевые (служебные, зарезервированные) слова;
  • константы;
  • знаки операций;
  • разделители (знаки пунктуации).

Идентификатор - последовательность из букв латинского алфавита, десятичных цифр и символов подчеркивания, начинающаяся не с цифры, например: RUN, Run, summa_factorial. Прописные и строчные буквы различаются. Таким образом, в этом примере два первых идентификатора различны. Длина различаемой части идентификатора зависит от реализации языка С++.

Ключевые (служебные) слова - это идентификаторы, зарезервированные в языке для специального использования. Не рекомендуется использовать символ подчеркивания в качестве начального символа при записи идентификаторов, так как такие конструкции активно применяются самим языком программирования.

Константа (литерал) - это лексема, представляющая изображение фиксированного числового, строкового или символьного (литерного) значения. Константы бывают:

  • целыми;
  • вещественными (с плавающей точкой);
  • перечислимыми;
  • символьными (литерными);
  • строковыми (строки или литерные строки).

Целые константы могут быть десятичными, восьмеричными и шестнадцатиричными. Десятичная целая константа определена как последовательность десятичных цифр, начинающаяся не с нуля, если это не число нуль, например: 16, 484216, 0, 4. Диапазон допустимых целых положительных значений от 0 до 4 294 967 295. Константы, превышающие указанное максимальное значение, вызывают ошибку на этапе компиляции. Отрицательные константы - это константы без знака, к которым применена операция изменения знака. Их абсолютные значения не должны превышать 2147483648.

Восьмеричные целые константы начинаются всегда с нуля, например 016 имеет десятичное значение 14.

Последовательность шестнадцатиричных цифр, которой предшествует 0x считается шестнадцатиричной константой. В шестнадцатиричные цифры кроме десятичных входят латинские буквы от а (или А) до f (или F). Таким образом, 0х16 имеет десятичное значение 22, a 0xF - десятичное значение 15.

В зависимости от значения целой константы компилятор по-разному представляет её в памяти ЭВМ. Соответствие между значениями целых констант и автоматически выбираемыми для них компилятором типами данных отображает таблица 1. Можно явно указать тип, используя суффиксы L, l (long) и U, u (unsigned). Например, константа 64L будет иметь тип long, хотя значению 64 должен быть приписан тип int, как это видно из таблицы 1. Для одной константы можно использовать два суффикса в произвольном порядке. Например, константы 0x22ul, 0x33Lu будут иметь типunsigned long.

Вещественные константы распознаются компилятором по внешним признакам. Константа с плавающей точкой может включать следующие семь частей:

  • целая часть (десятичная целая константа);
  • десятичная точка;
  • дробная часть (десятичная целая константа);
  • признак (символ) экспоненты е или Е;
  • показатель десятичной степени (десятичная целая константа, возможно со знаком);
  • суффикс F (или f) либо L (или l).

В записях вещественных констант могут опускаться: целая или дробная часть (но не одновременно); десятичная точка или признак экспоненты с показателем степени (но не одновременно); суффикс. Примеры: 66.; .0; .12; 3.14159F; 1.12e-2; 2E+6L; 2.71.

При отсутствии суффиксов вещественные константы имеют форму внутреннего представления, которой в языке С++ соответствует тип данных double. Добавив суффикс f или F, константе придают тип float. Константа имеет тип long double, если в ее представлении используется суффикс L или l. Диапазоны возможных значений и длины внутреннего представления (размер в битах) данных вещественного типа показаны в таблице 2.

Таблица 2. Данные вещественного типа

Тип данных Размер, бит Диапазон значений
float 32 от 3.4Е-38до 3.4Е+38
double 64 от 1.7Е-308 до 1.7Е+308
long double 80 от 3.4Е-4932 до 1.1Е+4932


Перечислимые константы вводятся с помощью служебного слова enum. Как правило, это целочисленные константы типа int, которым приписаны уникальные и удобные для использования обозначения. В качестве обозначений выбираются произвольные идентификаторы, не совпадающие со служебными словами и именами других объектов программы. Обозначения присваиваются константам с помощью определения, например: enum { one = 1, two = 2, three = 3 };. После такого определения в программе вместо константы 2 (и наряду с ней) можно использовать ее обозначениеtwo и т.д.

Если в определении перечислимых констант опускать знаки "=" и не указывать числовых значений, то они будут приписываться идентификаторам (именам) по умолчанию. При этом самый левый в фигурных скобках идентификатор получит значение 0, а каждый последующий увеличивается на 1.

Для перечислимых констант может быть введено имя типа, соответствующего приведенному списку констант. Имя типа - это произвольно выбираемый уникальный идентификатор, помещаемый между служебным словом enum и открывающейся фигурной скобкой. Например, определение: enum week { Sunday, Monday, Tuesday, Wednesday, Thursday, Ffriday, Saturday }; не только определяет константы, но и вводит перечислимый тип с именем week, который может в дальнейшем использоваться в определениях и описаниях других объектов.

Символьная (литерная) константа - это один символ, заключенный в апострофы. Для размещения их значений могут вводится переменные символьного типа, то есть типа char. Примеры констант: 'z', '*', '\0l2', '\0', '\n'. Последовательности литер, начинающиеся со знака '\', называют ESC-последовательностями. \v

Строка, или строковая константа, иногда называемая литерной строкой, определяется как последовательность символов, заключенная в кавычки. Среди символов строки могут быть ESC-последовательности, соответствующие не изображаемым символьным константам или символам, задаваемым значениями их внутренних кодов. В этом случае они также начинаются с обратной косой черты. Строки, записанные в программе подряд или через пробельные разделители, при компиляции конкатенируются (склеиваются). Таким образом, в тексте программы последовательность из двух строк:

"Строка - это массив символов. " "Строка имеет тип char[]."эквивалентна одной строке:

"Строка - это массив символов. Строка имеет тип char[]."

Размещая строку в памяти, транслятор автоматически добавляет в ее конец символ ‘\0’, то есть нулевой байт. Таким образом, количество символов во внутреннем представлении строки на 1 больше числа символов в ее записи. Пустая строка хранится как один символ "\0". Кавычки не входят в строку, а служат ее ограничителями при записи в программе. В строке может быть один символ, например, "А" - строка из одного символа. Однако в отличие от символьной константы 'А' длина внутреннего представления строки "А" равна 2. Строка может быть пустой "", при этом ее длина равна 1. Однако символьная константа не может быть пустой, то есть запись ' ' в большинстве реализаций недопустима.

 

4. Идентификаторы и служебные слова языка C++

ИДЕНТИФИКАЦИЯ - [identification]

1. Процесс отождествления объекта с одним из известных системе объектов.

2. Распознавание объектов.

1. Первый символ идентификатора должен быть буквой латинского алфавита (a,...,z, A,...,Z) или символом подчеркивания (_).

2. Использование в идентификаторе иных символов, кроме букв, цифр и знака подчеркивания, запрещается.

3. Строчные и прописные буквы в идентификаторах языка С не тождественны, то есть различаются.

4. Идентификаторы могут иметь любую длину. Но в разных системах программирования вводится своя конкретная длина для идентификаторов. Например, в Borland Ci++ она имеет максимальное значение - 32.

5. Запрещается использовать в качестве идентификаторов зарезервированные ключевые слова или наименования стандартных функций.

Приняты еще несколько соглашений для удобства работы с идентификаторами. Например, имена переменных рекомендуется записывать только строчными буквами латинского алфавита. Имена констант, напротив, - только прописными. Всюду в именах переменных разрешено использовать символ подчеркивания.

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

В языке С существуют зарезервированные идентификаторы или служебные слова (keywords), которые так же называют ключевыми словами. Их свободное применение запрещено. Они используются для обозначения как операторов языка С, так и для организации правильной работы компилятора. Назначение их в каждом конкретном случае строго определено. Поэтому эти слова ни в коем случае нельзя использовать в каких-то иных целях, кроме тех, для которых они введены в язык С.
Ниже в таблице приведены 32 служебных слова языка Си стандарта ANSI. Запомните запрет на их произвольное использование. Это следующие слова:

auto break case char const continue default do
double else enum extern float for goto if
int long register return short signed sizeof static
struct switch typedef union unsigned void volatile while

Как сказано выше, каждое служебное слово имеет определенное назначение. Некоторые из них являются описателями типов величин. Например:

  • char - символьная величина;
  • double - вещественная величина двойной точности;
  • enum - перечисляемый тип;
  • float - вещественная величина с плавающей точкой;
  • int - целочисленная величина;
  • long - целочисленная величина двойной точности;
  • short - целочисленная величина укороченной длины;
  • struct - величина структурного типа;
  • signed - знаковая величина;
  • union - величина объединяющего типа;
  • unsigned - величина беззнакового типа;
  • void - величина, значение которой отсутствует и так далее.

Другие описывают классы памяти компьютера, третьи - служат для автоматического построения операторов программы, четвертые - входят в состав оператора и так далее.

6. Знаки операций. Унарные операции. Бинарные операции: аддитивные, мультипликативные, сдвигов, поразрядные, операции отношений, логические, присваивания, операция «запятая», скобки в качестве операции.

Знаки операций обеспечивают формирование и последующее вычисление выражений. Один и тот же знак операции может употребляться в различных выражениях и по-разному восприниматься компилятором в зависимости от ситуации. Все знаки операций по количеству операндов делят на унарные, бинарные и трехразрядные. Бинарные операции бывают следующих видов: аддитивные, мультипликативные, сдвигов, поразрядные, операции отношений, логические, присваивания, адресной арифметики, операция "запятая".

Унарные операции (операции с одним операндом):

& получение адреса операнда;

* обращение по адресу (операндом должен быть адрес);

-/+ унарные операции изменения знака операнда ('+' – сделать операнд положительным);

~ поразрядное инвертирование внутреннего кода скалярного операнда;

! логическое отрицание значения операнда (применяется к операндам скалярных типов), результат – 0 (если операнд отличен от нуля) и 1 (если операнд равен нулю); в качестве логических значений в языке С используются целые числа:

0 – ложь, ≠0 – истина;

++ увеличение скалярного операнда на 1 (инкремент); префиксная операция – увеличение значения операнда до его использования, постфиксная операция – увеличение операнда после его использования; операнд не может быть константой;

-- уменьшение скалярного операнда на 1 (декремент); правила

оформления аналогичны инкременту; Sizeof (операнд) вычисление размера в байтах для объекта того типа, который имеет операнд;  (тип) операнд операция явного преобразования типа операнда.

Бинарные операции:

Аддитивные операции:

+ арифметическое сложение операндов;

- арифметическое вычитание операндов.

Мультипликативные операции:

* умножение операндов;

/ деление операндов; для целочисленных операндов возвращается только целая часть от результата деления;

% получение остатка от деления целочисленных операндов.

Операции сдвига:

<< сдвиг влево битового представления значения левого целочисленного операнда на количество разрядов, равное значению правого целочисленного операнда;

>> сдвиг вправо (аналогично).

Поразрядные операции:

& поразрядная конъюнкция битовых представлений значений целочисленных операндов;

| поразрядная дизъюнкция битовых представлений значений целочисленных операндов;

^ поразрядное "исключающее или" битовых представлений значений целочисленных операндов.

Операции отношения:

<, >, <=, >=, == (равно), != (не равно).

Логические бинарные операции:

&& конъюнкция арифметических операндов или отношений;

|| дизъюнкция арифметических операндов или отношений.

Операции присваивания:

=, *=, /=, %=, +=, -=, <<=, >>=,&=, |=, ^=.

Операции адресной арифметики:

. играет роль операции адресной арифметики при прямом выборе компонента структурного объекта;

-> косвенный выбор компонента структурного объекта;

[ ] играет роль операции адресной арифметики при индексировании элементов массива;

( ) играет роль операции адресной арифметики при вызове функций.

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

7. Основные и производные типы языка C++. Объекты и их атрибуты.

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

  • char (символьный);
  • short (короткий целый);
  • int (целый);
  • long (длинный целый);
  • float (вещественный);
  • double (вещественный с удвоенной точностью);
  • void (отсутствие значения).

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

char newsimbol = '\n' ;

long filebegin = 0L;

double pi = 3.1415926535897932385;

В обозначении типа может использоваться одновременно несколько служебных слов. Например, определение: long double zebra, stop; вводит переменные с именами zebra и stop вещественного типа удвоенной точности, но явно не присваивает этим переменным никаких начальных значений.

Употребляемые как отдельно, так и вместе с другими именами типов служебные слова unsigned (беззнаковый) иsigned (знаковый) позволяют для арифметического или символьного типа выбирать способ учета знакового разряда:

unsigned int i, j, k; // Значения от 0 до 65535.

unsigned long L, M ,N; // Значения от 0 до 4294967295.

unsigned char с, s;  // Значения от 0 до 255.

При таком определении переменные i, j, k могут принимать только целые положительные значения в диапазоне от 0 до 65535 и т.д.

Применение в определениях типов отдельных служебных слов int, char, short, longэквивалентно signed int, signed char, signed short, signed long. Именно поэтому служебное слово signed обычно опускается в определениях и описаниях. Использование при задании типа только unsigned эквивалентно unsigned int.

Основные типы данных представлены в таблице 1.

Таблица 1. Основные типы данных

Тип данных Размер, бит Назначение типа
unsigned char 8 Небольшие целые числа и коды символов.
char 8 Очень малые целые числа и ASCII-коды.
enum 16 Упорядоченные наборы целых значений.
unsigned int 16 Большие целые и счетчики циклов.
short int 16 Небольшие целые, управление циклами.
int 16 Небольшие целые, управление циклами.
unsigned long 32 Астрономические расстояния.
long 32 Большие числа, популяции.
float 32 Научные расчеты (7 значащих цифр).
double 64 Научные расчеты (15 значащих цифр).
long double 80 Финансовые расчеты (19 значащих цифр).

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

  • auto (автоматически выделяемая, локальная память) - используется при определении объектов блока (функции). При входе в блок объекту (переменной) выделяется память, которая освобождается при выходе из блока. По умолчанию всем переменным присваивается этот спецификатор;
  • register (автоматически выделяемая, по возможности регистровая память) - аналогичен auto, но для размещения объектов используются регистры, а не участки основной памяти. В случае отсутствия регистровой памяти компилятор обрабатывает такие объекты как объекты автоматической памяти;
  • static (внутренний тип компоновки и статическая продолжительность существования) - объект с таким спецификатором будет существовать в пределах того файла с исходным текстом программы или модуля, где он определен. Класс памяти static может приписываться переменным и функциям;
  • extern (внешний тип компоновки и статическая продолжительность существования) - объект этого класса глобален, то есть доступен во всех модулях (файлах) программы. Класс extern может быть приписан переменной или функции.

Кроме явных спецификаторов, на выбор класса памяти значительное влияние оказывают размещение определения и описаний объекта в тексте программы. Такими определяющими частями программы являются блок, функция, файл с текстом кода программы (модуль) и т.д. Таким образом, класс памяти, то есть размещение объекта (в регистре, в стеке, в динамически распределяемой памяти, в сегменте) зависит как от синтаксиса определения, так и от размещения определения в программе.

Продолжительность существования объектов (в частности, переменных) - это период, в течение которого идентификаторам в программе соответствуют некоторые значения. Определены три вида продолжительности:статическая, локальная и динамическая.

Объектам со статической продолжительностью существования память выделяется в начале выполнения программы и сохраняется до окончания ее обработки. Статическую продолжительность имеют функции и файлы. Остальным объектам статическая продолжительность существования может быть задана с помощью спецификаторов класса памяти static и extern. При отсутствии явной инициализации такие объекты по умолчанию инициализируются нулевыми, или пустыми значениями.

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

Объекты с динамической продолжительностью существования создаются и уничтожаются с помощью явных операторов в процессе выполнения программы. Для создания используется операция new и функция malloc(), а для уничтожения - операция delete или функция free().

8. L-выражения языка C++

Доступ к объектам и функциям обеспечивается выражениями, которые в этом случае ссылаются на объекты.

Выражение, которое обеспечивает ссылку на константу, переменную или функцию, называется l-выражением. Имя объекта в C++ является частным случаем l-выражения.

В C++ допускается изменение значений переменных. Значения констант и функций в C++ изменению не подлежат. l-выражение называется модифицируемым l-выражением, либо леводопустимым выражением, если только оно не ссылается на функцию, массив или константу. Таким образом, леводопустимыми выражениями называют l-выражения, которые ссылаются на переменные.

9. Классы памяти языка C++. Область (сфера) действия идентификатора (имени). Видимость объекта и пространства имен. Продолжительность существования объектов.

Все переменные в программе характеризуются не только типом, но и классом памяти. В языке Си существует четыре класса памяти: автоматический (automatic), регистровый(register), статический(static) и внешний(external).

Автоматическиепеременные в программе можно описать так:

auto A; auto char c1; auto int x= 125;

Если мы этим не пользовались, то только потому что опущенный описатель auto используется по умолчанию. Зона действия автоматической переменной ограничена блоком или функцией, где она описана. Она начинает существовать после обращения к функции и исчезает после выхода из нее. Таким образом,  автоматические переменные не занимают область в памяти. Значение автоматической переменной не может быть изменено другими функциями и в этих функциях может находится переменные с таким же именем.

Внешние переменные вводятся как нечто противоположное автоматическим. Это глобальныепеременные и к ним можно обращаться именами из любой функции. Поскольку внешеие переменные доступны везде, их можно использовать для связи между функциями, не пренебрегая механизму формальных параметров. Внешнии переменные могут определятся вне квкой-либо функции; при этом выделяется фактическая память. В любой другой функции, обращающейся к этим переменным, они должны описываться; делается явно с помощью описателяextern. Статическиепеременные, подобно автоматическим, локальны в той функции или блоке, где они описаны. Разница заключается в том, что статические переменные не исчезают, когда функция (блок)завершает работу, и их значения сохраняются для последующих вызовов функции. Описание статических переменных выглядит так:

static char c; static int a=1;

Идентификатор - последовательность букв и цифр произвольной длины; первый символ обязан быть буквой; подчерк '_' считается за букву; буквы в верхнем и нижнем регистрах являются различными.

Имя обозначает (денотирует) объект, функцию, тип, значение или метку. Имя вводится в программе описанием (#8). Имя может использоваться только внутри области текста программы, называемой его областью видимости. Имя имеет тип, определяющий его использование. Объект - это область памяти. Объект имеет класс памяти, определяющий его время жизни. Смысл значения, обнаруженного в объекте, определяется типом имени, использованного для доступа к нему.

Есть четыре вида областей видимости: локальная, файл, программа и класс.

Локальная: Имя, описанное в блоке, локально в этом блоке и может использоваться только в нем после места описания и в охватываемых блоках. Исключение составляют метки, которые могут использоваться в любом месте функции, в которой они описаны. Имена формальных параметров функции рассматриваются так, как если бы они были описаны в самом внешнем блоке этой функции.
Файл: Имя, описанное вне любого блока или класса,может использоваться в файле, где оно описано, после места описания.
Класс: Имя члена класса локально для его класса и может использоваться только в функции члене этого класса, после примененной к объекту его класса операции или после примененной к указателю на объект его класса операции ->. На статические члены класса и функции члены можно также ссылаться с помощью операции :: там, где имя их класса находится в области видимости. Класс, описанный внутри класса, не считается членом, и его имя принадлежит охватывающей области видимости.

Имя может быть скрыто посредством явного описания того же имени в блоке или классе. Имя в блоке или классе может быть скрыто только именем, описанным в охватываемом блоке или классе. Скрытое нелокальное имя также может использоваться, когда его область видимости указана операцией ::. Имя класса, скрытое именем, которое не является именем типа, все равно может использоваться, если перед ним стоит class, struct или union. Имя перечисления enum, скрытое именем, которое не является именем типа, все равно может использоваться, если перед ним стоит enum.

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

· переменная, объявленная глобально, т. е. вне всех блоков, существует на протяжении всего времени выполнения программы;

· локальные переменные, т. е. объявленные внутри блока, а также переменные с классом памяти register или auto, имеют время жизни только на период выполнения того блока, в котором они объявлены. Если переменная объявлена внутри блока с классом памяти static илиextern, то она имеет время жизни на период выполнения всей программы;

Видимость переменных и функций в программе определяется следующими правилами:

· переменная, объявленная или определенная глобально, видима от точки объявления или определения до конца исходного файла. Можно сделать переменную видимой и в других исходных файлах, для чего в этих файлах следует ее объявить с классом памяти extern;

· переменная, объявленная или определенная локально, видима от точки объявления или определения до конца текущего блока;

· переменные из объемлющих блоков, включая переменные, объявленные на глобальном уровне, видимы во внутренних блоках. Эту видимость называют вложенной. Если переменная, объявленная внутри блока, имеет то же имя, что и переменная, объявленная в объемлющем блоке, то это разные переменные, и переменная из объемлющего блока во внутреннем блоке будет невидимой;

· функции с классом памяти static видимы только в том файле, в котором они определены. Остальные функции видимы во всей программе;

· метки в функции видимы в пределах данной функции;

· имена формальных параметров, объявленные в списке параметров прототипа функции, видимы только от точки объявления параметра до конца объявления функции.

10. Различия между определениями и описаниями

Объект – структура данных, содержащая описание свойств внешнего объекта программирования. Метод – функция, работающая с объектом. Класс – описание структуры объекта и методов работы с ним.

Строго говоря, реализовать идеи ООП можно в классической среде программирования, соблюдая дух, а не букву технологии. Например, библиотека функций,работающая на общую структуру данных, может в первом приближении считаться классом.

Синтаксическое определение объекта и класса - структура со встроенными функциями.Структурированная переменная со встроенными в нее функциями идеально подходит под определение объекта. Не нужно пытаться изобретать велосипед, достаточно назвать вещи своими именами. Структурированная переменная – это объект, функции, встроенные в структурированный тип – это методы класса, а само определение структурированного типа (включающее и определение встроенных функций) – есть класс.

Синтаксическое определение класса – тип данных, определяемый программистом.Класс представляет собой описание структуры объектов одного вида с набором методов их обработки. Аналогия с типом данных здесь напрашивается сама собой. Тип данных – это форма представления данных с набором операций. Отличие состоит в том, что тип данных либо уже определен в языке, либо формально составляется из уже существующих (но без внутреннего программирования). Значит, класс можно определить как тип данных, определяемый программистом. Тогда объект – это переменная класса. Эти трактовка закреплена в языке: синтаксис определения переменных и объектов почти полностью идентичен.

11. Выражения и преобразования типов в языке C++

Комбинация знаков операций и операндов, результатом которой является определенное значение, называется выражением. Знаки операций определяют действия, которые должны быть выполнены над операндами. Каждый операнд в выражении может быть выражением. Значение выражения зависит от расположения знаков операций и круглых скобок в выражении, а также от приоритета выполнения операций.

В языке СИ присваивание также является выражением, и значением такого выражения является величина, которая присваивается.

При вычислении выражений тип каждого операнда может быть преобразован к другому типу. Преобразования типов могут быть неявными, при выполнении операций и вызовов функций, или явными, при выполнении операций приведения типов.

При выполнении операций производится автоматическое преобразование типов, чтобы привести операнды выражений к общему типу или чтобы расширить короткие величины до размера целых величин, используемых в машинных командах. Выполнение преобразования зависит от специфики операций и от типа операнда или операндов.

Рассмотрим общие арифметические преобразования.

1) Операнды типа float преобразуются к типу double.

2) Если один операнд long double, то второй преобразуется к этому же типу.

3) Если один операнд double, то второй также преобразуется к типу double.

4) Любые операнды типа char и short преобразуются к типу int.

5) Любые операнды unsigned char или unsigned short преобразуются к типу unsigned int.

6) Если один операнд типа unsigned long, то второй преобразуется к типу unsigned long.

7) Если один операнд типа long, то второй преобразуется к типу long.

8) Если один операнд типа unsigned int, то второй операнд преобразуется к этому же типу.

12. Последовательно выполняемые операторы языка C++.

Выражения представляют собой множество данных связанных между собой операциями - особыми операторами языка, возвращающих некоторое значение. Аргументы операций называют операндами. Большинство операций либо унарные (с одним операндом) или бинарные (с двумя операндами). Также операции характеризуются приоритетом (старшинством) выполнения в выражении.

Операции одинакового приоритета выполняются последовательно слева направо.



унарные арифметические операции

· ++ - инкремент, увеличивает значение целочисленной переменной на 1;

· -- - декремент, уменьшает значение целочисленной переменной на 1;

· + - оставляет знак числа;

· - - изменяет знак числа.

Существуют два варианта операции инкремента и декремента. Префиксный вариант (операнд справа) изменяет операнд сразу, постфиксный вариант (операнд слева) изменяет операнд после вычисления всего выражения, в которое входит операнд.










Последнее изменение этой страницы: 2018-04-12; просмотров: 494.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...