- •Министерство образования Республики Беларусь
- •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.6. Поразрядные логические операции
Поразрядные логические операции в порядке увеличения приоритета: | ^ & ~.
| |
поразрядное логическое ИЛИ (OR) |
^ |
поразрядное сложение по модулю 2 (XOR – исключающее ИЛИ) |
& |
поразрядное логическое И (AND) |
~ |
поразрядная инверсия |
Эти операции возвращают значения такого же типа, как и их операнды : если x и y целые, то и результат x&y тоже будет целый.
При выполнении этих операций вычисления ведутся над двоичным представлением операндов. Каждый бит результата определяется по битам операндов так:
Операнд 1 |
Операнд 2 |
AND |
OR |
XOR |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
1 |
1 |
1 |
0 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
Унарная инверсия требует единственного операнда справа от знака ~. Результат образуется поразрядной инверсией всех битов операнда.
При выполнении данных операций не имеет смысла смотреть на десятичное представление чисел.
int i = 0x45FF, // i= 0100 0101 1111 1111
j = 0x00FF; // j= 0000 0000 1111 1111
int k;
k = i ^ j; // k=0x4500 = 0100 0101 0000 0000
k = i | j; // k=0x45FF = 0100 0101 1111 1111
k = i & j // k=0x00FF = 0000 0000 1111 1111
k = ~i; // k=0xBA00 = 1011 1010 0000 0000
Данные операции используются тогда, когда необходимо обрабатывать биты, а не числа: например, при кодировании или сжатии информации. Также они используются для проверки значений конкретных битов числа: самая быстрая проверка на четность/нечетность числа – проверяем последний бит, битовые поля признаков.
int x = 11; // x & 1 ≡ x & 0x1 ≡ x & 0x0001
…0000 1011
& …0000 0001
----------
…0000 0001
Вывод: x&1, если =1, то число нечетное
int x = 12;
…0000 1100
& …0000 0001
----------
…0000 0000
Вывод: x&1, если =0, то число четное
9.7. Операции сдвига: >> и <<
Операции сдвига осуществляют смещение операнда влево << или вправо >> на число битов, задаваемое вторым операндом. Оба операнда должны быть целыми величинами.
При сдвиге влево << правые освобождающиеся биты устанавливаются в нуль. При сдвиге вправо >> метод заполнения освобождающихся левых битов зависит от типа первого операнда. Если тип unsigned, то свободные левые биты устанавливаются в нуль. В противном случае они заполняются копией знакового бита (это так называемое размножение знака).
Число двоичных разрядов для сдвига может быть задано только константой или константным выражением, т.е. выражением, целиком состоящим из констант. Нельзя написать: int x, y = 2; x = x >> y;
Результат операции сдвига не определен, если второй операнд отрицательный.
Операции сдвига – это наиболее быстрые способы умножения и деления на 2, 4, 8 и т. д. (т.е. на степень двойки).
Сдвиг влево << соответствует умножению первого операнда на степень числа 2, равную второму операнду, а сдвиг вправо >> соответствует делению первого операнда на 2 в степени, равной второму операнду.
unsigned char i=6, k; // i = 0000 0110
k = i<<1; // k = 0000 1100 = 12 = 6 * 21
k = i<<2; // k = 0001 1000 = 24 = 6 * 22
k = i>>1; // k = 0000 0011 = 3 = 6 / 21
char j=-4, n; // j = 1111 1100
n = j<<1; // n = 1111 1000 = -8 = -4 * 21
n = j>>2; // n = 1111 1111 = -1 = -4 / 22
unsigned char a=252; // a = 1111 1100
k = j>>2; // k = 0011 1111 = 63 = 252 / 22