- •Санкт-Петербургский
- •Структура программы на языке Си
- •Структура простейшей одномодульной программы
- •Комментарии в программе на языке Си
- •Начальные сведения о препроцессоре
- •Определение функции main().
- •Пример простейшей программы
- •Алфавит, синтаксис и семантика
- •Алфавит языка Си
- •Понятие о типе
- •Система типов языка Си Система типов языка Си
- •Понятие об объекте
- •Лексемы
- •Зарезервированные слова
- •Идентификаторы
- •Литералы
- •Целочисленные литералы
- •Литерал вещественного типа
- •Символьные литералы
- •Строковый литерал
- •Переменные
- •Символические константы в языке Си
- •Операторы, выражения и инструкции. Общие сведения.
- •Классификация операторов
- •Приоритет и ассоциативность операторов.
- •Побочные эффекты и вычисления выражений
- •Порядок вычисления выражений
- •Арифметические операторы и выражения
- •Унарные операторы
- •Бинарные операторы
- •Преобразования типа при выполнении бинарных операторов
- •Автоматическое преобразование типов
- •Явное преобразование типа
- •Математические функции
- •Оператор присваивания и инструкция присваивания
- •Простой оператор присваивания
- •.Множественное присваивание
- •Составной оператор присваивания
- •Преобразование типа при присваивании
- •Начальные сведения об указателях. Выходные параметры функции
- •Принятие решений и логические величины. Операторы отношения и сравнения на равенство
- •Логические операторы
- •Поразрядные операторы
- •Условные выражения (оператор ?:)
- •Оператор запятая
- •Оператор sizeof
- •Составная инструкция
- •Инструкция ifelse
- •Полная и сокращенная формы инструкции if
- •Вложенные инструкции if
- •Инструкция switch
- •Синтаксис инструкции switch
- •1.25.2. Использование инструкции switch
- •Функциональные компоненты цикла
- •Арифметические и итерационные циклы
- •Задачи, приводящие к арифметическим циклам
- •Задачи, приводящие к итерационным циклам
- •Циклические управляющие инструкции
- •Цикл, управляемый инструкцией for
- •Цикл, управляемый инструкцией while
- •Цикл, управляемый инструкцией do … while
- •Цикл с выходом
- •Вложенные циклы
- •Понятие о варианте и инварианте цикла
- •Объявления и определения (расширенное рассмотрение)
- •Спецификаторы объявления
- •Спецификаторы класса памяти.
- •Квалификаторы типа
- •Спецификаторы типа
- •Использование спецификаторов
- •Описатели
- •Использование зарезервированного слова typedefдля объявления синонимов типов
- •Функции
- •Понятие об абстракции и инкапсуляции
- •Функция языка Си и процедурная абстракция
- •Понятие о функции
- •Назначение функций
- •Определение функции
- •Функции, возвращающие и невозвращающие значение
- •Вызов функции. Передача параметров по значению
- •Внешние переменные и процедурная абстракция
- •Понятие о прототипе. Компиляция
- •Старый стиль определения функции
- •Массивы в стиле языка с89
- •Определение и объявление массивов
- •Определение и объявление одномерных массивов. Иницициализация одномерных массивов при их определении. Доступ к элементам массива.
- •Определение и инициализация двумерных массивов
- •Операции с массивами
- •Размещение массивов в оперативной памяти
- •Указатели
- •Операторы разыменования и взятия адреса
- •Области применения указателей
- •Нулевой указатель
- •Определение указателя
- •Недействительный указатель
- •Операции с указателями
- •Дополнительные сведения о разыменовании указателей
- •Присваивание указателей
- •Операция взятия адреса для указателя. Указатели на указатели
- •Указатели и операция индексирования
- •Арифметические операции с указателями
- •Сравнение указателей
- •Указатели и динамическая память
- •Функция malloc
- •Функция calloc
- •Функция realloc
- •Функция free
- •Указатели – параметры функций. Имитация передачи по ссылке
- •Указатели на функцию
- •Инициализация указателя на функцию
- •Операции с указателями на функцию
- •Табулирование произвольной функции одного переменного
- •Использование стандартной функции qsort
- •Указатели и массивы
- •Строковый литерал
- •Символические строковые константы
- •Строковые переменные
- •Инициализация строковых переменных
- •Операции со строковыми переменными
- •Ввод строк
- •Функция scanf()
- •Опасная функция gets()
- •Использование функции fgets()
- •Вывод строк
- •Функция printf()
- •Функция puts()
- •Функция fputs()
- •Библиотечные функции для обработки строк
- •Функция strlen()
- •Функции strcpy()иstrncpy()
- •Функции strcat() иstrncat()
- •Функция strcmp()
- •Массивы строк
- •Структуры
- •Объявление структур
- •Обращение к полям структуры
- •Инициализация структур
- •Операции над структурами
- •Массивы структур
- •Объявление массива структур
- •Идентификация элементов массива структур
- •Работа с внешними устройствами
- •Понятие потока
- •Текстовый поток
- •Двоичный поток
- •Указатель файла
- •Функция fopen()
- •Функция fclose()
- •Построковый ввод – вывод
- •Блоковый ввод – вывод
- •Примеры решенных задач
- •Прямой доступ к файлу
- •Функция fseek()
Условные выражения (оператор ?:)
Условные выражения записываются с помощью тернарного оператора ?:. Этот оператор имеет следующий формат:
выр1 ? выр2 : выр3
Здесь выр1,выр2ивыр3– выражения.
Условное выражение вычисляется следующим образом. Вначале оценивается булевское значение выражения выр1. Если его значением является true, то дальше вычисляется значение выражениявыр2и значение этого выражения становится значением всего условного выражения, в противном случае вычисляется значение выражениявыр3и его значение становится значением всего условного выражения.
В качестве примера применения условного выражения рассмотрим задачу о нахождении наибольшего значения двух вещественных чисел a и b. Ниже приведена программа, предназначенная для решения этой задачи.
/* Файл max.c */ #include<stdio.h> int main(void) { double a, b; printf(“a=”); scanf(“%lf”, &a); printf(“b=”); scanf(“%lf”, &b); printf(“max=%8.3f\n”, (a > b ? a : b)); return 0; }
Здесь использовалось то обстоятельство, что условное выражение действительно является выражением, и оно может быть использовано в качестве аргумента в вызове функции printf().
Оператор запятая
Это бинарный оператор, имеющий следующий формат:
выр1 , выр2
Здесь выр1 ивыр2– выражения. Вначале вычисляется левый операнд. Значение этого операнда после его вычисления отбрасывается (исключается из рассмотрения). Затем вычисляется правый операнд. Вычисленное значение этого операнда становятся типом и значением всего выражения в целом. В месте, где расположена запятая, находится точка следования (sequence point). Это означает, что до перехода к вычислению выражениявыр2 все побочные эффекты, которые могут иметь место при вычислении выражениявыр1 должны быть завершены. Оператор запятая в основном применяется в инструкцииforв ее первом и третьем выражениях (см. 1.29).
Оператор sizeof
Этот оператор в качестве своего результата возвращает размер памяти, занимаемый его операндом. Оператор используется в двух формах:
● sizeof(type)
● sizeof expr
В первой форме в качестве операнда используется тип, а во втором – выражение. Во втором случае выражение часто заключается в круглые скобки, хотя необходимости в этом нет.
Приведем примеры использования рассматриваемого оператора:
printf(“sizeof 2 = %d\n”, sizeof 2); printf(“sizeof(double) = %d\n”, sizeof(double));
Инструкции перехода
Инструкции перехода приводят к безусловной передаче управления в другую точку программы. К этой категории инструкций в языке Си относятся следующие инструкции:
● break,
● continue,
● goto,
● return.
Инструкция break
Эта инструкция используется только в теле инструкций for,while,do …whileиswitch.Ее назначение состоит в завершении выполнения инструкций, внутри которых она расположена. При использовании инструкцииbreakво вложенных циклах завершит свою работу только текущий цикл. После этого управление передается циклу, находящемуся “на один уровень выше”.
Инструкция continue
Эта инструкция используется только в теле циклических инструкций for,whileиdo…while. Ее выполнение приводит к завершению очередного шага цикла.
Инструкция goto
Выполнение этой инструкции состоит в прерывании естественного порядка выполнения программы и безусловной передаче управления. Рассматриваемая инструкция состоит из двух частей: зарезервированного слова gotoи имени метки. В качестве имени метки используется идентификатор. Пример инструкцииgoto:
gotoerror;
Чтобы эта инструкция выполнялась правильно, в программе должна встретиться инструкция, помеченная меткой error. Приведем пример такой инструкции:
error : printf(“Ошибка ввода\n”);
Инструкция return
Эта инструкция возвращает управление в вызывающую функцию. Если функция должна иметь возвращаемое значение, то в теле должна встретиться инструкция return, имеющая следующий формат:
return [выр];
Рассматриваемая инструкция состоит из двух структурных частей: зарезервированного слова returnи необязательного выражениявыр. Необходимость в выражениивыротсутствует в том случае, когда функция не возвращает значение. В качестве примера приведем определение функции, предназначенной для определения максимального значения двух чисел.
double max(double a, double b) { return ((a > b) ? a : b); }
В теле рассматриваемой функции max() находится только одна инструкция – инструкция return. Эта инструкция выполняет два действия. Во-первых, инструкция формирует с помощью условного выражения возвращаемый результат. Во-вторых, она прекращает вычисления в функции max() и передает управление в точку вызова функции.