- •Алфавит языка Си
- •Идентификаторы (имена) языка Си
- •Ключевые слова
- •Константы (литералы)
- •Комментарии
- •Пример программы на Си
- •Последовательность обработки программы на Си
- •Термины
- •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. Указания компилятору
- •Термины
2.3. Объявления, определения и описания в языке Си
Существуют различные термины в языке Си, такие как, объявления, определения и описания. В литературе присутствует некоторая терминологическая путаница между этими понятиями, связанная, в том числе, и с переводом английских терминов, частично являющимися синонимами, на русский язык.
Для однозначной интерпретации данных терминов будем понимать их следующим образов.
Объявление объекта (переменной) - это оператор, позволяющий устанавливать атрибуты объекта, резервировать для него память, связывать объект с идентификатором (именем) или делать известным компилятору идентификатор объекта.
Прежде чем использовать объект в программе, он должен быть объявлен. Объявления делятся на два класса: определения и описания.
Определение – это разновидность объявления, которое устанавливает атрибуты объекта (переменной), резервирует для него память и связывает объект с идентификатором (именем).
Описание – это разновидность объявления, которое делает известным компилятору идентификатор объекта.
Определять объект можно только один раз, описывать множество раз. Рассмотрим отличительные признаки определений от описания применительно для переменных.
Признаки определения переменных:
-
объявлена переменная без модификатора extern;
-
объявлена переменная с инициализатором.
Признаки описания переменных:
-
наличие модификатора extern (инициализация запрещена).
2.4. Объявления переменных стандартных типов
Общий формат объявления переменных:
[<спецификатор_класса_памяти>] [<модификатор>] <тип> <имя1>[=<инициализатор1>], <имя2>[=<инициализатор2>],…, <имяN>[=<инициализаторN>];
Необязательный элемент <спецификатор_класса_памяти> (необязательный элемент далее в записи форматов будет помещаться в квадратные скобки) одно из ключевых слов: auto, register, static, extern.
Необязательные элемент <модификатор> - могут быть ключевые слова: const, volatile и др.
Модификатор const означает, что инициализация (присвоение начального значения) переменной обязательна и далее значение переменной изменять нельзя. Модификатор volatile означает, что данная переменная может быть изменена где- то в другом месте, а не обязательно в этой программе, например, программой обработки прерываний (модификатор влияет на режим оптимизацию работы компилятора).
Примеры:
int i, j=10;
const float pi=3.14; // Далее запрещено изменять значение pi
extern double x; // Это есть описание, определение переменной в другом месте.
unsigned char C1=‘A’, C2=10, C3;
2.5. Преобразования типов
Преобразование типа выполняется в случае, когда некоторое значение одного типа (значение переменной или результат выражения) присваивается переменной другого типа.
Преобразования типов могут выполняться неявно (по умолчанию) или существует операция явного преобразования типа.
Следует отметить, что язык Си – это язык со слабой типизацией, допустимы неявные преобразования любого стандартного типа в другой любой стандартный тип.
Неявные преобразования типов
Примеры:
double x=10.5;
char Ch=x; // Допустимо
int i=x, j=Ch;
long L=1050;
unsigned char C1=L;
Сформулируем следующие правила неявного преобразования стандартных типов.
-
Преобразование более длинного целого типа в менее длинный целый: отсекаются старшие биты.
-
Преобразование менее длинного целого типа в более длинный целый: если преобразуется беззнаковый тип, то старшие биты заполняются 0, если знаковый, то битом знака.
-
При преобразовании целых типов одинаковой длины, содержимое не меняется, может меняться интерпретация знакового бита
-
Преобразование менее длинного вещественного в более длинное: мантисса дополняется нулями справа.
-
Преобразование более длинного вещественного в менее длинное: усечение младших битов мантиссы, если значение слишком велико – результат не определен.
-
Преобразование вещественного к целому: дробная часть отбрасывается, и результат преобразуется в long, далее работают правила для целых, если значение слишком велико – результат не определен.
-
Преобразование целых к вещественным: преобразование к long, далее к вещественному, возможна потеря точности.
Явное преобразование типов
Существует операция явного преобразования типа, ее формат:
(<тип>) <операнд> или
<тип>(<операнд>)
Вторая форма может использоваться только, если имя типа задается одним словом, например, вторая форма не подходит для типа unsigned short и других подобных.
Примеры:
char c=(char) a;
float x=float( c );