Опубликован: 05.11.2013 | Доступ: свободный | Студентов: 543 / 46 | Длительность: 11:51:00
Лекция 4:

Язык программирования Си

< Лекция 3 || Лекция 4: 123456 || Лекция 5 >

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.

< Лекция 3 || Лекция 4: 123456 || Лекция 5 >