- •Основные элементы языка Си
- •Константы
- •Константы целого типа
- •Задание.
- •Беззнаковые и длинные целые константы
- •Константы с плавающей точкой
- •Escape-последовательности
- •Символьные константы
- •Строковые константы
- •Задание.
- •Вопросы.
- •Основные операции языка Си
- •Общие положения
- •Арифметические операции
- •Унарные операции
- •Унарный минус
- •Операция унарный плюс.
- •Задание.
- •Операции инкремента и декремента
- •Задание.
- •Операции отношения и логические операции
- •Задание.
- •Операции присваивания
- •Примеры.
- •Задание.
- •Побитовые операции
- •Задание.
- •Логические побитовые операции
- •Задание.
- •Маскирование
- •Пример.
- •Задание.
- •Пример.
- •Задание.
- •Пример.
- •Пример.
- •Задание.
- •Пример.
- •Примеры.
- •Примеры.
- •Примеры.
- •Пример.
- •Задание.
- •Побочные эффекты. Приоритеты и порядок выполнения операций
- •Пример.
- •Пример.
-
Задание.
1. Какие значения примут переменные x, y, z и w после вычислений следующих выражений:
а) x = 1;y=1;z=1;
w=++x||++y||++z;
б) x = 1;y=1;z=1;
w=++x&&++y||++z;
в) x = 1;y=1;z=1;
w=++x&&++y&&++z;
г) x = --1;y=--1;z=--1;
w=++x&&++y||++z;
д) x = --1;y=--1;z=--1;
w=++x||++y&&++z;
е) x = --1;y=--1;z=--1;
w=++x&&++y&&++z;
2. Какие значения примут переменные x, y, z и w после вычислений следующих выражений:
x =y=z=w=1;
x*=y-=z+=w\%=1;
x-=y/=z*=++w;
% x-=y+=z*=++w;
3. В каком порядке будут вычисляться следующие выражения и каков будет
результат:
x=1;y=2;z=3;
x=y==z;
x==(y=z); (обязательны ли скобки?)
x==y<z;
x&&!y<=z;
-
Побитовые операции
В системном программировании часто возникает необходимость работать с отдельными битами памяти. Поэтому для низкоуровневых языков наличие побитовых операций обязательно, а в языках высокого уровня они обычно отсутствуют.
Однако Си, как язык системного программирования, имеет некоторый набор таких операций , которые можно разделить на три категории:
-
Операция получение обратного кода — инвертирование;
the one's complement operator — дополнение до единицы.
-
Логические побитовые операции;
-
Операции сдвига.
Унарная операция инвертирования (тильда) вызывает побитовое инвертирование своего операнда, то есть нули в машинном представлении заменяются на единицы и наоборот. Операция является префиксной и применяется только к операндам одного из целых типов (integer, long, short, unsigned, char). Чаще всего в программах этот операнд бывает беззнаковым восьмеричным или шестнадцатеричным:
0x7FF=0xF800
0xC5=0xFF3A
0x1111= 0xEEEE
0xFFFF= 0
052= 0177725
0177777=0
Заметим, что в восьмеричном представлении крайняя левая цифра (шестая у чисел 0177777 и 0177725) всегда совпадает с содержимым старшего бита внутреннего представления числа (почему?).
-
Задание.
Пусть i=0х5B3C. Какие значения в десятичной форме соответствуют i и i, если рассматривать обе величины как беззнаковые целые.
Ответ: 23356 и 42179.
-
Логические побитовые операции
Логические операции && и || позволяют выполнять
действия с переменными и выражениями, для которых понятие ложности
или истинности связано с равенством или неравенством операнда нулю.
Действия выполняются с операндами в целом, а не с отдельными их битами.
Для выполнения поразрядных операций в Си включены три логических
побитовых операции:
-
& побитовое " и"
-
^ побитовое " исключающее или"
-
| побитовое " или"
Операции выполняются независимо над каждой парой соответствующих битов в операндах. Сначала обрабатывается пара самых младших разрядов, затем пара следующих и т.д. Побитовые операции Си имеют свойства, обычные для двоичных логический операций.
Побитовое "и" (AND) дает единицу только если оба обрабатываемых бита установлены в 1.
Побитовое " исключающее или" (XOR) имеет результатом единицу только в том случае, если один из битов 1, а другой 0.
Побитовое " или" (OR) дает нуль только если оба операнда нули, а в остальных случаях результат единица.