- •Часть 1
- •1. Основы программирования на языке Си
- •1.1. Структура программы на языке Си.
- •1.2. Структура простейшей одномодульной программы
- •1.2.1. Комментарии в программе на языке Си
- •1.2.2. Начальные сведения о препроцессоре
- •1.2.3. Определение функции main().
- •1.2.4. Пример простейшей программы
- •1.3. Алфавит, синтаксис и семантика
- •1.4. Алфавит языка Си
- •1.5. Понятие о типе
- •1.6. Система типов языка Си
- •1.7. Понятие об объекте
- •1.8. Лексемы
- •1.9. Зарезервированные слова
- •1.10. Идентификаторы
- •1.11. Литералы
- •1.11.1. Целочисленные литералы
- •1.11.2. Литерал вещественного типа
- •1.11.3. Символьные литералы
- •1.11.4. Строковый литерал
- •1.12. Переменные
- •1.13. Символические константы в языке Си
- •1.14. Операторы, выражения и инструкции. Общие сведения.
- •1.14.1. Классификация операторов
- •1.14.2. Приоритет и ассоциативность операторов.
- •1.14.3. Побочные эффекты при вычислении выражений
- •1.14.4. Порядок вычисления выражений
- •1.15. Арифметические операторы и выражения
- •1.15.1. Унарные операторы
- •1.15.2. Бинарные операторы
- •1.15.3. Преобразования типа при выполнении бинарных операторов
- •1.15.3.1. Автоматическое преобразование типов
- •1.15.3.2. Явное преобразование типа
- •1.15.4. Математические функции
- •1.16. Оператор присваивания и инструкция присваивания
- •1.16.1. Простой оператор присваивания
- •1.16.2.Множественное присваивание
- •1.16.3. Составной оператор присваивания
- •1.16.4. Преобразование типа при присваивании
- •1.17. Начальные сведения об указателях. Выходные параметры функции
- •1.18. Принятие решений и логические величины. Операторы отношения и сравнения на равенство
- •1.18.1. Логические операторы
- •1.18.2. Поразрядные операторы
- •1.19. Условные выражения (оператор ?:)
- •1.20. Оператор запятая
- •1.21. Оператор sizeof
- •1.22.4. Инструкция return
- •1.23. Составная инструкция
- •1.24. Инструкция if else
- •1.24.1. Полная и сокращенная формы инструкции if
- •1.24.2. Вложенные инструкции if
- •1.25. Инструкция switch
- •1.25.1. Синтаксис инструкции switch
- •1.25.2. Использование инструкции switch
- •1.26. Функциональные компоненты цикла
- •1.27. Арифметические и итерационные циклы
- •1.27.1. Задачи, приводящие к арифметическим циклам
- •1.27.2. Задачи, приводящие к итерационным циклам
- •1.28. Циклические управляющие инструкции
- •1.29. Цикл, управляемый инструкцией for
- •2. Примеры решенных задач
- •2.1. Линейные вычислительные процессы
- •2.2. Организация разветвлений
- •2.2.1. Простейшие разветвления
- •2.2.2. Многовариантные разветвления
- •2.2.2.1. Использование переключателя switch
- •2.2.2.2. Использование вложенных инструкций if else if
- •2.2.2.3. Использование вложенных инструкций if ... If
- •2.2.2.4. Использование сокращённых форм инструкции if
- •2.2.3. Рекомендации по программированию
- •2.3. Организация циклов
- •2.3.1. Простые циклы
- •2.3.2. Циклы и разветвления
- •2.3.2.1. Разветвление до цикла
- •2.3.2.2. Разветвление внутри цикла
- •2.3.2.3. Разветвление после цикла
- •2.3.2.4. Циклы в ветвях разветвлений.
- •2.3.3. Рекомендации по программированию
- •Содержание
- •1. Основы программирования на языке Си
- •Литература
1.14.1. Классификация операторов
Операторы языка Си делятся на три категории:
● унарные,
● бинарные,
● тернарные.
В основу этой классификации положено количество операндов, с которыми работает оператор. Унарные операторы имеют только один операнд, бинарные операторы работают с двумя операндами и у единственного в языке Си тернарного оператора – три операнда (? :). Например:
● -a (выражение содержит унарный минус),
● a – b (выражение содержит бинарный минус),
● a > b ? a : b (выражение содержит тернарный оператор).
1.14.2. Приоритет и ассоциативность операторов.
Важнейшими характеристиками операторов являются их приоритет и ассоциативность. Использование этих характеристик позволяет определить смысл выражения. Если отсутствуют скобки, то операнды сильнее связываются с операторами, имеющими более высокий приоритет. Можно говорить о том, что операторы с более высоким уровнем приоритета сильнее “притягивают” операнды. Если два оператора имеют одинаковый приоритет, то связывание определяется ассоциативностью. Имеются две разновидности ассоциативности операторов: левосторонняя и правосторонняя. При левосторонней ассоциативности процесс связывания начинается слева, а при правосторонней ассоциативности – справа. Приоритет и ассоциативность позволяют выполнить группировку операторов и операндов в выражении, содержащем более одного оператора.
Приоритеты операторов языка Си и их ассоциативность представлены в таблице, приведенной ниже.
|
Приоритет |
Название оператора |
Знак операции |
Ассоциативность |
|
1 (высший) |
Функция |
() |
Левосторонняя
|
|
Индексирование |
[] |
||
|
Селектор поля структуры |
-> |
||
|
Селектор поля структуры |
. |
||
|
Инкремент постфиксный |
++ |
||
|
Декремент постфиксный |
-- |
||
|
2 |
Логическое отрицание |
! |
Правосторонняя |
|
Побитовое отрицание |
~ |
||
|
Инкремент префиксный |
++ |
||
|
Декремент префиксный |
-- |
||
|
Унарное сложение |
+ |
||
|
Унарное вычитание |
- |
||
|
Разыменование |
* |
||
|
Взятие адреса |
& |
||
|
Приведение типа |
(тип) |
||
|
Размер объекта |
sizeof |
||
|
3 |
Умножение |
* |
Левосторонняя |
|
Деление |
/ |
||
|
Вычисление остатка деления |
% |
||
|
4 |
Сложение бинарное |
+ |
|
|
Вычитание бинарное |
- |
||
|
5 |
Сдвиг влево |
<< |
|
|
Сдвиг вправо |
>> |
||
|
6 |
Меньше |
< |
|
|
Неменьше |
>= |
||
|
Больше |
> |
||
|
Небольше |
<= |
||
|
7 |
Сравнение на равенство |
== |
|
|
Сравнение на неравенство |
!= |
||
|
8 |
Побитовое И |
& |
|
|
9 |
Побитовое исключающее ИЛИ |
^ |
|
|
10 |
Побитовое ИЛИ |
| |
|
|
11 |
Логическое И |
&& |
|
|
12 |
Логическое ИЛИ |
|| |
|
|
13 |
Вычисление выражения по условию |
?: |
Правосторонняя |
|
14 |
Присваивания: |
= += -= *= /= %= >>= <<= &= ^= &= ^= |= |
|
|
15 (низший) |
Запятая |
, |
Левосторонняя |
В таблице операторы, имеющие одинаковый приоритет, объединены в группы. За каждой группой операторов закреплен номер, определяющий ее приоритет. Наибольший приоритет (1) имеет группа, расположенная вначале таблицы, а наименьший (15) – имеет оператор “запятая”, который находится в конце таблицы.
Приведем примеры выражений, при вычислении которых необходимо учитывать приоритет и ассоциативность операторов.
Пример 1. Рассмотрим следующее выражение:
a + b * c
В этом выражении используются два оператора: + (сложить) и * (умножить). Оператор умножить имеет более высокий приоритет по сравнению с оператором сложить. Это следует из таблицы приоритетов, приведенных выше. В рассматриваемом примере вначале будет выполнено умножение переменных b и c, а затем - сложение полученного результата со значением переменной a и полученное значение станет значением всего рассматриваемого выражения.
Пример 2. Рассмотрим выражение, в котором операторы имеют одинаковый приоритет:
a * b / c
Операторы * и / (делить) имеют одинаковый приоритет. В этом случае следует учитывать ассоциативность операторов. Обратившись к таблице, приведенной выше, находим, что операторы * и / имеют одинаковый приоритет и являются левоассоциативными. При левосторонней ассоциативности операторы выполняются в порядке их следования слева направо. Поэтому вначале будет выполнено умножение, а затем деление.
