- •Алфавит языка Си
- •Идентификаторы (имена) языка Си
- •Ключевые слова
- •Константы (литералы)
- •Комментарии
- •Пример программы на Си
- •Последовательность обработки программы на Си
- •Термины
- •2.1. Концепция типа данных
- •2.2. Базовые типы данных
- •2.2. Атрибуты объектов
- •2.2.1. Класс памяти
- •2.2.2. Область (сфера) действия, связанного с объектом идентификатора
- •2.2.3. Область видимости объекта
- •2.2.4. Продолжительность существования объекта (время жизни)
- •2.2.5. Тип компоновки (связывания)
- •2.3. Объявления, определения и описания в языке Си
- •2.4. Объявления переменных стандартных типов
- •2.5. Преобразования типов
- •Термины
- •3.1. Определение и общая классификация операторов
- •3.2. Последовательно выполняемые операторы
- •3.3. Операции языка Си
- •3.4. Приоритеты и порядок выполнения операций, тип результата выражения
- •Тип результата выражения арифметической бинарной операции
- •Даны X, y (значения вводятся с клавиатуры). Вычислить a, если
- •Термины
- •4.1. Условный оператор
- •4.2. Переключатель
- •4.3. Операторы циклов
- •4.4. Оператор безусловной передачи управления
- •4.5. Оператор возврата из функции
- •4.6. Оператор выхода из цикла или переключателя
- •4.7. Оператор перехода к следующей итерации цикла
- •Термины
- •5.1. Указатели
- •5.2. Ссылки
- •5.3. Массивы
- •5.3.1. Одномерные массивы
- •Int a[100]; // Объявление массива из 100 элементов типа int
- •Инициализация массива
- •Массивы и указатели
- •Динамические массивы
- •5.3.2. Многомерные массивы
- •Инициализация многомерных массивов
- •Динамические многомерные массивы
- •Указатель на массив указателей и указатель на массив
- •Int ** p1; // Указатель на массив указателей
- •Int (*p2)[10]; // Указатель на массив из 10 элементов типа int
- •Термины
- •6.1. Структуры
- •Int X; // Поле структуры
- •Int X; // Поле структуры
- •Int X; // Поле структуры
- •Инициализация структуры
- •Int year, page; // Год издания и число страниц
- •6.2. Объединения
- •6.3. Битовые поля структур и объединений
- •Int a1: 10; // Битовое поле из 10 бит
- •Int a2: 14; // Битовое поле из 14 бит
- •Int :6; // Пропускаем 6 бит
- •6.4. Директива определения типа typedef
- •Термины
- •7.1. Определение, описание и вызов функции
- •7.2. Использование значений параметров по умолчанию
- •7.3. Изменение значений скалярных параметров в функциях
- •7.3.1. Передача параметров в функции по значению
- •7.3.1. Передача параметров в функции по указателю (по ссылке)
- •7.4. Передача в функцию массивов
- •7.4.1. Передача в функцию массивов, не являющихся строками
- •7.4.2. Передача в функцию строк
- •7.5. Функции с переменным количеством параметров
- •7.6. Рекурсивные функции
- •7.7. Подставляемые (inline) функции
- •7.8. Указатели на функции
- •7.10. Шаблоны функций
- •7.11. Возможные параметры функции main
- •Термины
- •8.1. Общие сведения о вводе-выводе
- •8.2. Стандартные потоки ввода-вывода
- •8.3. Функции для вывода в поток stdout
- •8.4. Функции для считывания из потока stdin
- •8.5. Ввод- вывод в файлы Открытие файла
- •Закрытие файла
- •Определение конца файла
- •Функции записи в файл
- •Функции чтения из файла
- •Функции позицирования в файлах
- •Функции для сброса буферов
- •Термины
- •9.1. Стадии и основные команды препроцессорной обработки
- •9.2. Замены в тексте
- •9.3. Макроподстановки
- •9.4. Включение текстов из файлов
- •9.5. Условная компиляция
- •9.6. Директива нумерации строк
- •9.7. Директива обработки ошибок
- •9.8. Директивы # и ##
- •9.9. Заранее определенные препроцессорные идентификаторы
- •9.10. Указания компилятору
- •Термины
Лекция № 1. Основные элементы языка программирования Си (Си++)
Введение. Историческая справка
Язык Си представляет собой язык программирования общего назначения, характеризующийся краткостью выражений, современными управляющими конструкциями и структурами данных, а также богатым набором операций. Разработчики языка дали ему следующую характеристику: «Си – это язык не слишком высокого уровня, не слишком объемный и не приспособленный специально к какой- либо конкретной области приложений. Но зато отсутствие в нем каких-либо ограничений и большая общность делают его более удобным и эффективным для решения многих задач, чем языки, даже считающиеся по разным причинам более мощными».
Первоначально язык Си разработан в США сотрудниками фирмы Bell Laboratories в начале 70-х годов для операционной системы (ОС) UNIX. Операционная система UNIX, компилятор Си и практически все основные прикладные программ для UNIX написаны на Си. Но язык Си не привязан к какой-либо конкретной аппаратной или системной платформе, он широко применяется и в других операционных системах, например, в ОС типа Windows (Windows XP, Windows Vista, Windows 7 и др.). И хотя язык Си называют «языком системного программирования», поскольку на нем удобно писать компиляторы и операционные системы, он столь же удобен и для написания больших прикладных программ в самых различных областях.
Предшественники языки BCPL и B. Многие ключевые идеи Си пришли из языка BCPL. BCPL оказал влияние на Си опосредованно – через язык B, разработанный в 1970 году для первой системы UNIX на ЭВМ DEC PDP-7. (Отсюда и название языка Си, буква английского алфавита С следует за буквой B).
Первое описание языка дано его разработчиками – Б. Керниганом и Д. Ритчи. После было разработано десятки реализаций языка Си, поддерживающий разный диалект.
В 1983 г. при Американском национальном институте стандартов (American National Standards Institute - ANSI) образован комитет по стандартизации языка Си, в 1989 г. утвержден стандарт ANSI языка Си. Большинство средств и возможностей этого стандарта поддерживаются современными компиляторами. Эту версию языка принято называть ANSI C или C89. Однако в конце 1990-х годов стандарт подвергся пересмотру, что привело к публикации нового стандарта ISO 9899:1999 в 1999 году. Этот стандарт обычно называют «С99».
Приведем некоторые особенности языка Си:
-
язык Си – язык программирования «среднего» уровня: поддерживает операции низкого уровня (операции над битами), базовые типы отражают те же объекты, что и язык Ассемблера (байты, машинные слова, символы, строки), в то же время, имеет основные управляющие конструкции, присущие языкам «высокого» уровня;
-
поддерживает механизм указателей на переменные и функции;
-
язык со слабой типизацией, с одной стороны слабый контроль за преобразованием типов повышает эффективность программ, с другой, является источником ошибок и затрудняет отладку;
-
относительно мал по объему, в нем отсутствуют встроенные операторы ввода-вывода, динамического распределения памяти (в языке Си++ появились такие операторы), управления процессами и т.д., однако, в системное окружение входят различные библиотеки функций, что позволяет отделить особенности архитектуры компьютера от реализации языка.
Рассмотрим основные элементы языка Си, начнем рассмотрение с алфавита языка.
-
Алфавит языка Си
Алфавит Си включает:
-
прописные и строчные буквы английского алфавита: A,…,Z, a,…,z;
-
арабские цифры 0, 1,…, 9;
-
специальные символы:
-
пробельные символы (неотображаемые символы): пробел, табуляция, перевод строки, новая строка, возврат каретки, новая страница, вертикальная табуляция,
-
другие символы: , . ; : ? ‘ ! “ / | \ ~ _ ( ) { } [ ] > < # % & ^ - = + * (в некоторых компиляторах, например, Visual C++ разрешается в идентификаторах использовать символ $).
-
Символы алфавита находятся в первой половине кодовой таблицы (первые 128 символов) кодировки ASCII.
Из символов алфавита строятся лексемы.
Лексема – единица текста программы, имеющая для компилятора самостоятельный смысл.
Примеры лексем: идентификаторы, ключевые (зарезервированные) слова, знаки операций, константы, разделители.
-
Идентификаторы (имена) языка Си
Идентификатор (имя переменной, функции или другого объекта) – это последовательность букв английского алфавита, десятичных цифр, символа подчеркивания, начинающаяся не с цифры (в некоторых компиляторах, например, Visual C++ разрешается в идентификаторах использовать символ $).
Прописные и строчные буквы в идентификаторах различаются (идентификаторы х и Х это разные имена).
Примеры верных идентификаторов: x, X, abc124, A_c3, x4er, x_, __d.
Примеры неверных идентификаторов (первый символ – цифра): 1c, 4sd.
-
Ключевые слова
Ключевые слова – это зарезервированные идентификаторы, имеющие специальное значение для компилятора.
Ключевые слова используются в качестве имен стандартных типов, управляющих конструкций, и т.п. Программист не может их использовать в качестве имен своих объектов.
Список ключевых слов языка Си:
auto |
double |
int |
struct |
break |
else |
long |
switch |
case |
enum |
register |
typedef |
char |
extern |
return |
union |
const |
float |
short |
unsigned |
continue |
for |
signed |
void |
default |
goto |
sizeof |
volatile |
do |
if |
static |
while |
Дополнительно компилятор Microsoft Visual C++ включает следующие ключевые слова:
__asm |
dllimport2 |
__int8 |
naked2 |
__based1 |
__except |
__int16 |
__stdcall |
__cdecl |
__fastcall |
__int32 |
thread2 |
__declspec |
__finally |
__int64 |
__try |
dllexport2 |
__inline |
__leave |
|
-
Константы (литералы)
Константа – это значение, которое не может быть изменено в процессе работы программа.
В языке Си выделяют следующие разновидности констант, которые могут иметь разные типы и формы представления:
-
Целые константы.
Целые константы существуют для представления в программе целых значений. Константы могут иметь разные типы. Тип константы определяет представление константы в оперативной памяти: кодировку константы, объем в байтах, какой набор значений может представляться константой, а также операции, которые можно выполнять с константой. Существуют следующие типы целых констант:
-
тип int (по умолчанию), в оперативной памяти константа данного типа кодируется в MS DOS – 2 байтами, в Win32 – 4 байтами, примеры: 1245, 6, 175, 5, 1425;
-
тип long – в оперативной памяти константа кодируется 4 байтами, константа будет иметь этот тип, если диапазон выходит за тип int (в MS DOS), или явно указывается тип с помощью суффикса l (L), примеры: 12l, 14567L, 125234 (для MS DOS);
-
константы могут быть представлены типами unsigned int и unsigned long, для явного указания необходимо использовать суффикс u (U), примеры 105u (unsigned int), 105ul(unsigned long).
Целые константы всегда задают неотрицательные значения, для задания отрицательного значения используют операцию унарный минус, которую применяют к целой константе: -1000, -200l.
Целые константы также могут иметь различные формы представления. Формы представления введены для удобства программиста, одно и то же значение константы может быть представлено в различных формах в исходном тексте программы, при это после компиляции полученный исполняемый код и кодирование константы в памяти будет идентично и не зависит от формы представления. Для целых констант существуют три формы представления:
-
в десятичной системе счисления (по умолчанию) – 1234, 378l, 346;
-
в шестнадцатеричной системе счисления, признаком данного представления являются 2 первых символа константы 0x (или 0X), в константе можно использовать шестнадцатеричные цифры: 0..9, A (a), B (b), …, F (f), примеры – 0x10, 0x10acd, 0XFFFF;
-
в восьмеричной системе счисления, признаком данного представления является первый символ 0, в константе можно использовать восьмеричные цифры: 0..7, примеры – 010, 070, 01237;
Вещественные константы.
Вещественные константы служат для представления вещественных значений, которые могут иметь целую и дробные части. По аналогии с целыми константами существуют различные типы и формы представления вещественных констант. Для вещественной константы можно применять операцию унарный минус с целью получения отрицательного значения.
Существует следующие три типа вещественных констант:
-
тип double (по умолчанию), в оперативной памяти константа кодируется 8 байтами, примеры: 12.5, .123, 0.5, 1. (наличие точки в таком представлении обязательно);
-
тип float – 4 байта, используется суффикс f (F), примеры: 10.5f, 0.123F;
-
тип long double – 10 байт, используется суффикс l (L), примеры: 10.5l, 0.9L.
Существуют две формы представления вещественных констант:
-
форма с точкой (десятичная форма), примеры: 10.125, 1. (значение 1.0), .125 (значение 0.125), 0.125, представляется в форме десятичной дроби, состоит из трех основных элементов целой части, точки, дробной части, причем, целая или дробная часть могут отсутствовать, наличие точки обязательно, если целая часть отсутствует, то она считается равной 0, если дробная часть отсутствует, то она также считается равной 0 ;
-
форма со знаком экспоненты (экспоненциальная форма): 1e-5 , 12.23E4F (тип константы float), представляется в виде мантиссы и порядка, мантисса записывается слева от знака экспоненты (Е или е), порядок — справа от знака. Значение константы определяется как произведение мантиссы и возведенного в указанную в порядке степень числа 10. .
Символьные константы. Изначально в Си стандарта ANSI символьные константы представлялись одним символом, который мог быть буквой, цифрой, знаком пунктуации или специальный символом, заключенным в апострофы, примеры, ‘a’, ‘d’, ‘1’, ‘.’, ‘ ‘, данные константы представлены в памяти типом char и занимают 1 байт. Значением символьной константы является числовое значение кода символа в кодировке, используемой в данной операционной системе, например, в кодировке ASCII.
Символьные константы могут участвовать в арифметических операциях на правах полноценных целых чисел, хотя чаще их сравнивают с другими символами. Некоторые символы представляются в символьных и строковых константах с помощью специальных управляющих последовательностей символов, начинающихся с ‘\’ (косая обратная наклонная черта), называемых эскейп- последовательностями. Примеры: ‘\\’ - символ обратный слеш, ‘\’’ - символ апостроф, ‘\”’ - символ двойные кавычки, ‘\n’ – символ конец строки (код 10), ‘\r’ – возврат каретки (код 13), ‘\a’ – звуковой сигнал (код 7), ‘\b’ – возврат на шаг (забой) (код 8). Кроме того, любой символ можно представить в виде его кода в восьмеричной или шестнадцатеричной системах счисления в форматах ‘\ooo’ или ‘\xhh’, где o – восьмеричная цифра, а h – шестнадцатеричная цифра (значение восьмеричное кода не может превышать 255). Например, символ пробел с десятичным кодом 32 может быть записан как ‘ ‘, или в шестнадцатеричном коде как ‘\x20’ или в восьмеричном коде как ‘\40’.
В некоторых компиляторах, например, Visual C++ разрешены много символьные константы (до 4-х символов): ‘asdf’, ‘GR’, они представлены в памяти типом int (первый символ – младший байт).
-
Строковые константы – последовательность символов, заключенных в кавычки (не в апострофы), внутри строковых констант допускается использовать эскейп- последовательности или коды символов. Пример: “начало строки\nтекст с новой строки”, при печати текст будет выводится на две строки. Формально строковая константа является массивом символов. Во внутреннем представлении строки в оперативной памяти в конце присутствует нулевой символ ‘\0’, так что физический объем памяти для хранения строки превышает количество символов, записанных между кавычками на единицу.
-
Константы типа перечислений. Можно создавать перечисляемый тип, содержащий константы. Переменным этого типа можно присваивать значения только этих констант. Данные константы представляются в памяти точно так же, как константы типа int.
Формат перечислений следующий:
enum <имя_типа> {
<имя1>[=<инициализатор1>],
<имя2>[=<инициализатор2>],
……………….
<имяN>[=<инициализаторN>] };
Идентификаторы <имя1>, <имя2>, …, <имяN> -выступают далее в качестве констант, по умолчанию, если нет инициализатора, первая константа инициализируется 0, каждая последующая на 1 больше.
Пример перечисления
enum A
{
a, // 0
b, // 1
c=10, // 10
d // 11
};
Далее в программе обращаться к данным константам, int i=b; переменной i будет присвоено значение 1.
-
Существует еще одна константа – это, так называемый, нулевой указатель, для задания которого введена именованная константа NULL, используется для задания значения указателя, который ни на что не указывает. Обычно соответствует значению 0, но не обязательно во всех системах.