- •Часть 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.4. Порядок вычисления выражений
Под порядком вычисления (order of evaluation) понимается порядок, в котором вычисляются значения отдельных членов выражения. В языке Си имеется небольшое количество операторов, для которых определен порядок вычисления операндов. К числу таких операторов относятся:
● логическое И (&&),
● логическое ИЛИ (||),
● тернарный оператор (?:),
● оператор запятая (,).
Для других операторов очередность вычисления операндов не определена. Например, при анализе выражения sin(x) + cos(x) нельзя ожидать, что вызов функции sin(x) будет выполнен до вызова функции cos(x).
1.15. Арифметические операторы и выражения
В языке Си имеется шесть унарных и пять бинарных арифметических операторов, показанных в приводимой ниже таблице. В таблице предполагается, что переменные i и n имеют целый тип, а переменные a и b – любой числовой тип.
|
Оператор |
Назначение |
Пример |
|
+ |
Унарный плюс |
+a |
|
- |
Унарный минус |
-a |
|
++ |
Две разновидности инкремента |
++a (префиксный инкремент) |
|
a++ (постфиксный инкремент) |
||
|
-- |
Две разновидности декремента |
--a (префиксный декремент) |
|
a-- (постфиксный декремент) |
||
|
+ |
Бинарное сложение |
a + b |
|
- |
Бинарное вычитание |
a – b |
|
* |
Умножение |
a * b |
|
/ |
Деление |
a / b |
|
% |
Остаток от деления нацело |
i % n |
1.15.1. Унарные операторы
Остановимся на отдельных операторах. Отметим, что унарный оператор “+” относится к категории программистских недоразумений. Этот оператор никаких полезных действий не выполняет. Дело в том, что значение выражения, содержащего этот оператор, совпадает со значением его операнда. Выражение, содержащее унарный оператор “-”, возвращает значение, отличающееся от операнда только знаком.
Особое место среди унарных операторов занимают операторы инкремента (++) и декремента (--). Операнд, к которому применяются эти операторы, должен относиться к категории lvalue. Особенность этих операторов связана с наличием при их выполнении побочного эффекта. Побочный эффект состоит в изменении значения операнда на 1. Причем для инкремента значение его операнда увеличивается на 1, а для декремента - уменьшается на 1. Оба оператора существуют в двух формах: префиксной и постфиксной формах. Форма оператора не влияет на побочный эффект, имеющий место при выполнении оператора, а определяет возвращаемое оператором значение. При префиксной форме оператор возвращает измененное значение операнда, а при использовании постфиксной формы возвращается первоначальное значение операнда.
Приведем пример. Пусть имеется следующий фрагмент программы.
/* ..........................*/ int n = 5; int m = 5; printf(“++n=%d\n”, ++n); printf(“=%d\n”, n); printf(“m++=%d\n”, m++); printf(“m=%d\n”, m); /* ...........................*/
В результате выполнения рассматриваемого фрагмента программы вывод на экран дисплея будет иметь следующий вид:
++n=6 n=6 m++=5 m=6
В рассматриваемом примере к переменным “n” и “m”, имеющим равные значения, были применены различные формы инкремента. К переменной “n” была применена префиксная форма инкремента, а к переменной “m” – постфиксная форма. Окончательные значения рассматриваемых переменных оказались одинаковыми. Значения, возвращаемые в результате вычисления выражений ++n и m++, оказались разными. Выражение ++n вернуло новое значение своего операнда (с учетом побочного эффекта), а выражение m++ вернуло исходное значение своего операнда.
