Главная страница

Основные элементы языка программирования Си алфавит, идентификаторы, ключевые слова, константы


Скачать 0.78 Mb.
НазваниеОсновные элементы языка программирования Си алфавит, идентификаторы, ключевые слова, константы
Дата04.03.2022
Размер0.78 Mb.
Формат файлаdocx
Имя файлаAYa.docx
ТипДокументы
#382846
страница2 из 7
1   2   3   4   5   6   7

Базовые типы данных в Си++.







Символьные типы

Для представления символов в приложении используются типы char, wchar_t, char16_t и char32_t.

Переменная типа char в качестве значения принимает один символ в одинарных кавычках: char c ='d'. Также можно присвоить число из указанного выше в списке диапазона: char c = 120. В этом случае значением переменной c будет тот символ, который имеет код 120 в таблице символов ASCII.

В стандарте С++11 были добавлены типы char16_t и char32_t, которые ориентированы на использование Unicode. Однако на уровне ОС пока не реализованы потоки для работы с этими типами. Поэтому если потребуется вывести на консоль значения переменных этих типов, то необходимо преобразовать переменные к типам char или wchar_t.

В данном случае при выводе перед переменными указывается операция приведения к типу char - (char), благодаря чему значения переменных b, c и d преобразуются в тип char и могут быть выведены на консоль с помощью потока std::cout.

Целочисленные типы

Целочисленные типы представлены следующими типами: short, unsigned short, int, unsigned int, long, unsigned long, long long и unsigned long long.

Типы чисел с плавающей точкой

Типы чисел с плавающей точкой и/или дробные числа представлены такими типами как float, double и long double.

Спецификатор auto

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

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

Атрибуты объектов

Под объектом в данном случае понимается поименованная область памяти
(переменная, функция, массив и т.п.)
Кроме типов для объектов явно или по умолчанию определяются следующие атрибуты:
– класс памяти;
– область (сфера) действия, связанного с объектом идентификатора (имени);
– область видимости объекта;
– продолжительность существования объекта;
– тип компоновки (связывания).
Класс памяти - свойство объекта, размещенного в памяти (переменной), которое
определяет продолжительность существования объекта (время жизни), тип компоновки
(связывания) и другие атрибуты.
Для явного задания классов памяти используются следующие модификаторы:
1. auto – автоматическая или локальная память. Память под переменную с этим
модификатором выделяется в стеке каждый раз при выполнении оператора,
содержащего определение переменной. Освобождение памяти происходит при
выходе из блока, в котором определена переменная. Время ее жизни — с момента
описания до конца блока. Для глобальных переменных (переменных, объявленных
вне блока), этот спецификатор не используется, а для локальных он принимается по
умолчанию, поэтому задавать его явным образом большого смысла не имеет.
Блок – это последовательность объявлений, определений и операторов, заключенных в
фигурные скобки {...}.
2. register – регистровая память, аналогично auto, но память выделяется по
возможности в регистрах процессора. Если такой возможности у компилятора нет,
переменные обрабатываются как auto. В стандарте С++17 не используется,
компилятор выдает предупреждение.
3. static – «статическая» память, внутренний тип компоновки, т.е. переменная
доступна только в одном файле проекта, где она определена и статическая
продолжительность существования, т.е. переменная существует в течение всего
времени выполнения программы. Инициализируется один раз при первом
выполнении оператора, содержащего определение переменной.
4. extern – «внешняя» память, внешний тип компоновки, т.е. переменная доступна во
многих файлах проекта, и статическая продолжительность существования.
Если класс памяти явно не определен, то для переменных, определенных вне блоков
класс памяти – extern, а для определенных внутри блоков – auto.

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

Понятие видимости объекта по смыслу близко к понятию области действия. Данное
понятие стали выделять отдельно в связи с появление в языке Си++ новой операции
«изменение области видимости».
Область видимости объекта - часть исходного кода программы, в которой к объекту
можно непосредственно обращаться по его идентификатору.
Чаще всего область видимости совпадает с областью действия, различия появляются,
если идентификатор используется повторно внутри внутренних блоков в качестве имени для
другого объекта. Такие внутренние блоки выпадают из области видимости внешнего объекта.
Неформально можно записать:
«Область видимости» «≤» «Области действия»
Существует операция изменения области видимости. Ее формат:
::<идентификатор>
Данная операция является унарной и позволяет обращаться к глобальным объектам
(переменным) даже если внутри блока данное имя используется для другой переменной.

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

Тип компоновки (связывания) определяет соответствие идентификатора
конкретному объекту в программе, исходный текст которой размещен в нескольких файлах,
т.е. можно ли идентификатор использовать в нескольких файлах проекта или его можно
использовать только в одном файле.
Два вида связывания:
• внутреннее, к объекту можно обращаться только в одном файле (модуле) проекта;
• внешнее, к объекту можно обращаться из различных файлов (модулей) проекта, при
этом переменная в одном файле должна быть определена, а в других файлах описана с
модификатором extern.



  1. Определения и описания переменных.

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

Определения и описания переменных стандартных типов
Общий формат определения (описания) переменных:
[<спецификатор_класса_памяти>] [<модификаторы>] <тип> <имя1>[=<иниц1>],
<имя2>[=<иниц2>],..., <имяN>[=<иницN>];
Модификаторы: const и volatile.

Примеры:
int i, j=10;
const float pi=3.14; // Запрещено далее изменять значение переменной
extern double x; // Описание

unsignedcharC1=‘A’, C2=10, C3;

Преобразования типов
Си++ - язык со слабой типизацией, допустимы неявные преобразования любого
стандартного типа в другой любой стандартный тип.
Неявные преобразования типов (выполняются автоматически)
Примеры:
double x=10.5;
char Ch=x; // Допустимо
int i=x, j=Ch;
long L=1050;
unsigned char C1=L;
Правила преобразования стандартных типов
Преобразование более длинного целого типа в менее длинный целый: отсекаются
старшие биты.
Преобразование менее длинного целого типа в более длинный целый: если
преобразуется без знаковый тип, то старшие биты заполняются 0, если знаковый, то битом
знака.
При преобразовании целых типов одинаковой длины, содержимое не меняется, может
меняться интерпретация знакового бита
Преобразование менее длинного вещественного в более длинное: мантисса
дополняется нулями справа.
Преобразование более длинного вещественного в менее длинное: усечение младших
битов мантиссы, если значение слишком велико – результат не определен.
Преобразование вещественного к целому: дробная часть отбрасывается, и результат
преобразуется в long, далее работают правила для целых, если значение слишком велико
результат не определен.
Преобразование целых к вещественным: преобразование к long, далее к
вещественному, возможна потеря точности.
Явное преобразование типов
Существует операция явного преобразования типа, ее формат:
(<тип>) <операнд> или
<тип>(<операнд>) (разрешена, если имя типа задано одним идентификатором, нельзя
использовать для типов вида unsigned int).
Примеры:
int a=129;
char c=(char) a;
float x=float( c );

  1. Последовательно выполняемые операторы, классификация

Последовательно выполняемые операторы при выполнении тела функции
выполняются последовательно друг за другом. Можно привести следующую
классификацию последовательно выполняемых операторов:
– операторы – объявления, например, объявления переменных int i, j, k=10; double x, y;
– операторы – выражения, строятся из операндов и знаков операций, выражение
задает правило вычисления некоторого значения, проведем следующую
классификацию выражений:
• на базе операции присваивания «=»: x=y+10;
• на базе операций инкремент, декремент (++ --): i++; --j;
• вызов функции: f1();
• комбинированные выражения: x=i++ + f();
– составной оператор – это последовательность операторов, заключенных в
фигурные скобки { }, синтаксически составной оператор воспринимается как
отдельный оператор, блок – разновидность составного оператора, внутри которого
есть определения переменных, которые используются внутри блока, тело функции
также является блоком, в котором локализованы параметры функции;
– пустой оператор «;» пустой оператор может использоваться там, где синтаксис
требует наличие оператора, но никаких действий выполнять не требуется,
например, в качестве тела цикла for , когда все действия определены в заголовке
цикла.
Перед любым оператором может ставиться метка. Метка это идентификатор, после
которого ставится символ «:»
Met1: x=x+y;
Область действия метки – тело функции, имя метки должно быть уникальным
внутри тела функции.

  1. Условный оператор и оператор-переключатель.

Условный оператор служит для бинарного ветвления фрагмента исходного кода
программы, в зависимости от условия («истина» или «ложь») выполняется или один
фрагмент кода (оператор) или другой фрагмент кода (оператор).
Формат условного оператора:
if (<выражение>) <оператор1>
[ else <оператор2> ]

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

Переключатель

В отличие от условного оператора переключатель может использоваться для
мультиветвления фрагмента исходного кода программы, т.е. фрагмент исходного кода
делится на несколько фрагментов и в зависимости от условий выполняется один фрагмент
из нескольких (или несколько из нескольких).
Формат переключателя:
switch(<переключающее_выражение>)
{
case <константное_выражение1>: <операторы>
case <константное_выражение2>: <операторы>
........
case <константное_выражениеN>: <операторы>
[ default: <операторы> ]
}
<переключающее_выражение> - значение целочисленное или приводящееся к
целому, например, тип char.
<константное_выражениеX> - целочисленное или приводящееся к целому.

При выполнении переключателя управление передается на подходящую метку вида
case <конст_выр>: , значение которой совпадает со значением переключающего
выражения или на метку default (она не обязательна), если ни одна из меток не сработала.
После передачи управления выполняются все операторы до конца переключателя, вне
зависимости от наличия меток. Для выхода из переключателя необходимо использовать
оператор break;

  1. Операторы цикла: цикл с предусловием, цикл с постусловием, цикл for.

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


1. Цикл с предусловием имеет формат:
while(<выражение_условие>) <оператор>
<выражение_условие> - значение этого выражения может быть любого типа языка
Си, заменяющиго логический (целый, вещественный, указатель), значение условия
считается истинным, если оно отлично от нуля, при этом выполняется тело цикла, телом
цикла может быть составной оператор или блок.



2. Цикл с постусловием имеет формат:
do <оператор> while(<выражение_условие>);
Цикл работает аналогично предыдущему, но только в начале выполняется оператор
– тело цикла, затем проверяется выражение – условие.
Блок схема фрагмента алгоритма с циклом с постусловием.

3. Цикл for имеет формат:
for([<инициализаторы>];[<выражение_условие>]; [<модификации>]) <оператор>
<инициализаторы> используется для объявления и присвоения начальных
значений переменным, используемым в цикле, можно записать несколько выражений,
разделенных запятой.
<выражение_условие> - определяет условия продолжения цикла, задается
аналогично, как в предыдущих видах циклов.
<модификации> (список операторов-выражений) выполняются после каждой
итерации цикла и служат обычно для изменения параметров цикла, здесь можно записать
несколько выражений через запятую.
Телом цикла может быть простой оператор, составной оператор или блок;



10.Операторы передачи управления (goto, break, continue).

Оператор безусловной передачи управления goto
Имеет следующий формат:
goto <метка>;
Пример:
m1: x=y/3;
........
if (x>0) goto m1;
После выполнения оператора передачи управления следующим выполняется
оператор, следующий за меткой, причем передавать управление можно как выше по
программе, так и ниже. Передавать управление можно только внутри блока, являющегося
телом функции, соответственно имя метки должно быть уникальным внутри тела
функции.
При использовании меток должны выполняться ограничения:
- не перескакивать через объявления, содержащие инициализацию;
- не входить внутрь блока из вне (в цикл, переключатель, условный оператор).
1   2   3   4   5   6   7


написать администратору сайта