Россия, г. Москва |
Язык программирования Си
3.2. Унарные операторы
Кроме бинарных операторов, в языке Си существует достаточно большое число унарных операторов.
Например, допустима следующая запись:
х=9; —х++++;
После ее выполнения х будет равен 10. Два минуса слева означают уменьшение значения х на единицу до использования значения переменной в выражении, два раза по два плюса после х означают два раза увеличить х на единицу после использования значения х в расчете выражения.
Попробуйте, например, рассчитать, чему будет равен х после выполнения следующих строчек на языке Си:
int x = 1; x += x++ + ++x;
(запись х + = 5 эквивалента записи х = х + 5).
Любопытно, что некоторые компиляторы не умеют правильно интерпретировать подобную "мешанину" из унарных и бинарных операторов в выражении с одной переменной. Тем более, стоит избегать подобных форм записи, сложных для интерпретации. Это не только дополнительная потеря времени, но и потенциальный источник ошибок.
3.3. Средства низкого уровня
Как уже было сказано, адрес любой переменной получается при помощи операции "&", указанной перед именем этой переменной. С результатом такой операции можно производить все арифметические действия, доступные для целых чисел.
Фактически полученный с помощью операции вычисления адреса объект является указателем. При арифметических операциях с ними Си руководствуется информацией о типе адресуемого объекта.
Как и в большинстве языков программирования, Си допускает переопределение типов, в ходе которого никаких преобразований внутреннего представления не происходит, однако появляется возможность работать с одним типом как с другим. Для этого достаточно перед переменной поставить в скобках название нового типа:
int iv; char cv; cv=(char)iv;
Кроме работы с адресами и преобразования типов, в языке Си предусмотрен набор битовых операций:
& - поразрядная конъюнкция;
^ - поразрядное исключающее или;
| - поразрядная дизъюнкция;
<< - поразрядный сдвиг влево;
>> - поразрядный сдвиг вправо.
Не стоит их путать с операциями логическими:
&& - логическая конъюнкция;
! - отрицание;
|| - логическая дизъюнкция.
Так, 2&1 дадут результат 0 (ложно), 2|1 дадут результат 3 (истинно), а 2&&1 дадут 1 (истинно) и 2||1 тоже дадут 1 (истинно).
Поразрядное кодирование
В ряде случаев для представления кодовых значений удобно давать наименования группам разрядов машинного слова или даже отдельным разрядам. Обычно такие значения трактуются как беззнаковые (unsigned) числа. Подобные описания в Си описываются как структуры с битовыми полями. Например:
struct STATUS_FLAG { unsined Overflow :1; unsined Start_Up :1; unsined Source_Code :4; unsined Result_Id :2; } In_Out_Status;
Эта структура описывает 8-битовый байт, разделенный на четыре поля. Первые два из них являются отдельными битами со значениями 0 или 1. Третье поле Source_Code представляет собой нормальное 4-разрядное шестнадцатеричное число, а последнее поле (два разряда) может представлять коды от 0 до 3.