- •Часть 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.18.1. Логические операторы
Логические операторы используются для повышения выразительных средств языка. В языке Си имеются три логических оператора:
● ! – логическое НЕ,
● && - логическое И,
● || - логическое ИЛИ.
Оператор ! является унарным оператором, а операторы && и || - бинарными. В качестве операндов логических операторов могут использоваться арифметические выражения, отношения и сравнения на равенство. Логические операции задаются с помощью так называемых таблиц истинности. Предположим, что имеются две логические величины a, b. Тогда таблицы истинности для рассматриваемых операторов можно представить в следующем виде:
|
a |
b |
Логическая операция |
|||
|
!a |
!b |
a && b |
a || b |
||
|
false |
false |
true |
true |
false |
false |
|
false |
true |
true |
false |
false |
true |
|
true |
false |
false |
true |
false |
true |
|
true |
true |
false |
false |
true |
true |
Значение результата выполнения оператора ! является обратным по отношению к его операнду. Значение, полученное в результате выполнения оператора &&, истинно только в том случае, когда истинны его оба операнда. Значение результата выполнения оператора || истинно в том случае, когда истинен хотя бы один операнд. Отметим, что бинарные операторы относятся к немногочисленной категории операторов, для которых фиксирован порядок вычисления операндов. Этот порядок выполнения состоит в следующем. Вначале всегда вычисляется левый операнд. Если после его вычисления значение выражения становится очевидным, то правый операнд не вычисляется. Например, если при вычислении выражения, содержащего оператор &&, значение левого операнда оказалось равным false, то из этого заведомо следует, что значением всего выражения будет логическое значение false. При этом необходимость в вычислении правого операнда отпадает.
1.18.2. Поразрядные операторы
Эти операторы могут быть полезными в тех случаях, когда программисту требуется непосредственно взаимодействовать с аппаратурными компонентами компьютера. В языке Си имеется шесть поразрядных операторов:
● ~ поразрядное НЕ,
● & поразрядное И,
● | поразрядное ИЛИ,
● ^ поразрядное ИСКЛЮЧАЮЩЕЕ ИЛИ,
● << сдвиг влево,
● >> сдвиг вправо.
Отметим, что поразрядные операторы применимы только к целочисленным операндам.
Краткое описание поразрядных операторов содержится в таблице, приведенной ниже.
|
Оператор |
Название |
Описание |
|
~ |
Поразрядное НЕ |
Все биты операнда, равные 0, устанавливаются в 1, а все биты, значения которых равны 1, устанавливаются в 0. |
|
& |
Поразрядное И |
Бит результата устанавливается в 1 только в том случае, когда соответствующие биты обоих операндов установлены в 1, во всех других случаях этот бит устанавливается в 0. |
|
| |
Поразрядное ИЛИ |
Бит результата устанавливается в 1 в том случае, когда хотя бы один из соответствующих битов операндов установлен в 1 и устанавливается в 0, если оба соответствующих бита, установлены в 0. |
|
^ |
Поразрядное ИСКЛЮЧАЮЩЕЕ ИЛИ |
Бит результата устанавливается в 1, если соответствующий бит одного и только одного операнда установлен в 1, во всех других случаях этот бит устанавливается в 0. |
|
<< |
Сдвиг влево |
Сдвигает влево биты левого операнда на количество позиций, которое определяется правым операндом. Правые освобождающиеся позиции заполняются нулями. |
|
>> |
Сдвиг вправо |
Сдвигает вправо биты левого операнда на количество позиций, которое определяется правым операндом. Способ заполнения освобождающихся позиций является аппаратно – зависимым. |
Пусть имеется следующий фрагмент программы, содержащий выражения, использующие поразрядные операции.
/* .....................*/ unsigned char n = 0x2A; unsigned char m = 0x71; unsigned char r;
r = ~n; printf("~n = %X\n", r); r = ~m; printf("~m = %X\n", r); r = n & m; printf("n & m = %X\n", r); r = n | m; printf("n | m = %X\n", r); r = n << 2; printf("n << 2 = %X\n", r); r = m >> 1; printf("m >> 1 = %X\n", r); /* ........................*/
Результаты выполнения этого фрагмента программы имели следующий вид:
~n = D5 ~m = 8E n & m = 20 n | m = 7B n << 2 = A8 m >> 1 = 38
