- •Министерство образования Республики Беларусь
- •1. Что такое программа на языке программирования
- •2. Общее знакомство с языком с
- •3. Структура простой программы на языке с
- •4. Что такое программа на языке с
- •5. Представление информации и типы данных в языке с
- •6. Константы
- •7. Переменные
- •8. Элементарный вВод и вывод информации
- •9. Выражения и операции
- •9.1. Арифметические операции
- •9.2. Операция изменения знака
- •9.3. Операции инкремента и декремента
- •9.4. Операция присваивания
- •9.6. Поразрядные логические операции
- •9.8. Логические операции и операции отношения
- •9.9. Условная операция «? :»
- •9.10. Операция последовательного вычисления
- •9.11. Операция определения требуемой памяти в байтах sizeof
- •9.12. Операция приведения типа (type)
- •10. Операторы управления вычислительным процессом
- •10.1. Операторы ветвления if и else
- •10.2. Оператор switch
- •10.3. Оператор цикла while
- •10.4. Оператор цикла do…while
- •10.5. Оператор цикла for
- •10.6. Бесконечные циклы
- •10.7. Другие управляющие средства языка с
- •10.8. Стандартные математические функции
- •11. Вычисление выражений и побочные эффекты
- •11.1. Преобразования типов при вычислении выражений
- •11.2. Побочные эффекты при вычислении выражений
- •12. Массивы
- •12.1. Описание массива
- •12.2. Инициализация массива
- •12.3. Ввод-вывод массива
- •12.4. Двумерные массивы (массивы массивов)
- •13. Указатели
- •14. Адресная арифметика
- •15. Массивы и указатели
- •15.1. Указатели и одномерные массивы
- •15.2. Указатели и двумерные массивы
- •16. Строки
- •17. Массивы строк
- •18. Функции
- •18.1. Определение функции в языке с
- •18.2. Возвращение значений из функции
- •18.3. Формальные и фактические параметры функции
- •18.4. Вызов функции
- •18.5. Объявление и определение функции: прототип функции
- •19. Передача параметров в функции
- •19.1. Способы передачи параметров в функции
- •19.2. Передача параметров в функции в языке с
- •19.3. Передача указателей в функции
- •20. Классы хранения и видимость переменных
- •20.1. Общие положения
- •20.2. Спецификаторы класса памяти
- •20.3. Область видимости функций
- •20.4. Глобальные переменные
- •20.5. Глобальные статические переменные
- •20.6. Локальные переменные
- •20.7. Статические локальные переменные
- •20.8. Регистровые переменные
- •20.9. Выводы
- •21. Организация памяти программы
- •22. Многофайловая компиляция (проекты)
- •23. Передача в функции массивОв
- •23.1. Передача одномерных массивов в функции
- •23.2. Передача двумерных массивов в функции
- •23.3. Передача в функции символьных строк
- •23.4. Возвращение указателей из функций
- •24. Функции с переменным количеством аргументов
- •24.1. Соглашения о вызовах: модификаторы функций
- •24.2. Объявление списка параметров переменной длины
- •25. Передача параметров в функцию main()
- •26. Указатели на функцию
- •27. Стандартные функцИи языка с
- •27.1. Функции для работы со строками
- •27.2. Функции для проверки символов и преобразования данных
- •27.3. Функция быстрой сортировки – gsort()
- •27.4. Функция двоичного поиска – bsearch()
- •28. Работа с файлами
- •28.1. Основные понятия
- •28.2. Основные функции для работы с файлами
- •28.3. Открытие и закрытие файлов
- •28.4. Ввод/вывод символов
- •28.5. Ввод/вывод строк
- •28.6. Форматированный ввод/вывод
- •28.7. Ввод/вывод блоков данных
- •28.8. Другие средства для работы с файлами
- •28.9. Ввод/вывод низкого уровня (префиксный доступ к файлам)
- •29. Типы, определяемые пользователем: Перечисления, структуры и объединения
- •29.1. Переименование типов – оператор typedef
- •29.2. Перечисления (enum)
- •29.3. Основные сведения о структурах
- •29.4. Структурные переменные в памяти компьютера
- •29.5. Доступ к полям структуры
- •29.6. Массивы структур
- •29.7. Структуры и функции
- •29.8. Объединения (union)
- •30. Динамическая память
- •30.1. Понятие динамического объекта
- •30.2 Создание и уничтожение динамических объектов
- •30.3 Динамическое размещение одномерных массивов и строк
- •30.4 Динамическое размещение двумерных массивов
- •30.5. Функции для работы с блоками памяти
- •31. Динамические структуры данных
- •31.1. Понятие структуры данных
- •31.2. Структуры, ссылающиеся на себя
- •31.3. Связанные списки
- •31.5. Очереди
- •Ниже приводятся примеры функций для очереди (структура элемента очереди совпадает со структурой элемента стека в примере выше):
- •32. Препроцессор языка с
- •32.1 Директива включения файлов
- •32.2. Директива определения макрокоманд (макросов)
- •32.3 Директива условной компиляции
- •32.4 Дополнительные директивы препроцессора
9.1. Арифметические операции
В языке С имеется стандартный набор арифметических операций: +, -, /, *. Ассоциативность арифметических операций принята слева направо.
Обратить внимание! Деление целых чисел в С дает всегда целое число. Если же хотя бы один из операндов вещественный, результат также будет вещественным. В языке С принято правило, согласно которому дробная часть у результата деления целых чисел отбрасывается. Это действие называется «усечением», т.е. результат деления целых чисел округляется не до ближайшего целого, а всегда до меньшего целого числа.
3/2 // результат = 1 int a = 2, b = 1;
3./2 // результат = 1.5 float sr = (a+b) / 2; // 1
sr = (a+b) / 2.; // 1.5
К арифметическим операциям относится и операция взятия остатка %. Данная операция делит первый операнд на второй и берёт остаток от деления:
int x=25;
int y=10;
int z;
z=x%y; // z = 5
Операция % определена только над целыми операндами. Это так называемое деление по модулю: результат – остаток от деления. Аналогом в Паскале была операция mod.
9.2. Операция изменения знака
Знак минус используется для указания или изменения алгебраического знака некоторой величины.
a = -15;
b = -a; // b = 15
Когда знак используется подобным образом, данная операция называется «унарный минус».
x = -x; // Операция изменяет алгебраический знак x. Не надо для изменения знака умножать на -1: x*(-1) или вычитать из 0: 0-x.
9.3. Операции инкремента и декремента
Специфическими для С являются операции инкремента ++ и декремента --.
Инкремент – увеличение переменной на единицу. Новое значение сохраняется в переменной.
Декремент – уменьшение переменной на единицу. Новое значение сохраняется в переменной.
Эти операции могут применяться только к переменным. Операнд инкремента и декремента может иметь целый или вещественный тип или быть указателем.
Операции инкремента и декремента могут записываться как перед своим операндом (префиксная форма записи), так и после него (постфиксная запись).
В префиксной форме (плюсы стоят до переменной) сначала происходит увеличение переменной на единицу, и потом это увеличенное значение участвует в выражении. При постфиксной форме (плюсы стоят после переменной) переменная сначала участвует в выражении, а только затем она увеличивается.
int x = 5;
int y;
y = ++x; // y = 6, x = 6
y = --x; // y = 5, x = 5
y = x++; // y = 5, x = 6
y = x--; // y = 6, x = 5
9.4. Операция присваивания
В языке С знак равенства не означает «равно». Он означает операцию присваивания некоторого значения. Операнду, находящемуся в левой части, присваивается значение операнда, стоящего в правой части операции: x = 5; (теперь в переменной x хранится значение 5).
Левым операндом должна быть переменная. Нельзя записать: 5 = x;
В языке С можно писать в одном предложении сразу несколько операций присваивания. Например, обнуление трех переменных можно сделать так:
int x, y, z;
x = y = z = 0;
Присваивания выполняются справа налево: сначала переменная z получает значение 0, затем переменная y и наконец x.
В языке С принято следующее правило: любое выражение с оператором присваивания, заключенное в круглые скобки, имеет значение, равное присваиваемому. Например, выражение (a = 2 + 5) имеет значение 9. После этого можно записать другое выражение, например ((a = 2 + 5) < 10), которое всегда будет истинным.
Можно писать даже так:
x = (a = 2 + 5) * (b = 1 + 1); // a=7 b=2 x=14
В языке С имеется еще несколько других операций присваивания, которые отличаются от описанной операции – это так называемые комбинированные операции присваивания.
9.5. Арифметические операции с присваиванием: +=, -=, *=, /=, %=
Данные операции позволяют сократить код:
int x = 5;
x += 5; // две последние строки эквивалентны
x = x + 5;
Арифметические операции с присваиванием используются, когда необходимо внести изменения в переменную, используя при этом значение, которое хранится в этой переменной в данный момент.
Такие операции присваивания есть еще и для операций сдвига и поразрядных логических операций: <<=, >>=, &=, ^=, |=.