Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЯП - ПОИТ (Бахтизин) часть 1 редакт.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
1.76 Mб
Скачать

2.2.3. Операции сдвига

Операции сдвига >> и << сдвигают биты в переменной соответственно вправо и влево на указанное число двоичных разрядов. Общий вид операции сдвига вправо (в сторону младших разрядов переменной):

переменная >> число сдвигов

а общий вид операции сдвига влево (в сторону старших разрядов переменной):

переменная << число сдвигов

Выдвигаемые из переменной биты теряются, а в освободившиеся с противоположной стороны биты вдвигаются нули. При этом, если переменная является знаковой, то при сдвиге вправо происходит размножение знакового бита.

Операции битового сдвига могут также использоваться для выполнения быстрого умножения и деления целых чисел. Сдвиг влево на 1 бит равносилен умножению на 2, а сдвиг вправо – делению на 2.

int x = 7;

...

x = x << 2; // x будет равно 28

2.2.4. Операция присваивания

Общий вид операции присваивания следующий:

имя_переменной = выражение;

где выражение может быть как простой одиночной константой, так и сложным выражением. Как в Бейсике и Фортране, в Си используется знак равенства для отображения операции присваивания (не так, как в Паскале или Модуле-2, где используется составной символ := ). В левой части операции присваивания должна использоваться ячейка памяти, определяемая или переменной, или элементом массива, или разыменованным указателем. Не допускаются имена функций и констант. При нарушении данного правила (например, если в левой части операции стоит имя функции или константы) компилятор Borland C++ 3.1 сообщает об ошибке «Lvalue required».

Язык Си позволяет присваивать нескольким переменным одни и те же значения путем использования многочисленных присваиваний в одной операции. Например, данный фрагмент программы присваивает переменным х, у и z значение 0:

х = у = z = 0;

Язык Си имеет несколько специальных сокращенных операций, кодирующих некоторые операции присваивания. Например:

х = х + 10;

может быть кратко записано как

х += 10;

Операция += сообщает компилятору, что необходимо присвоить переменной х старое значение х плюс 10.

Это сокращение работает для всех бинарных операций в Си (где требуется два операнда). Стандартная форма сокращений следующая:

переменная = переменная оператор выражение;

то же самое, что и

переменная оператор = выражение;

В другом примере

х = х – 100;

записывается как

х –= 100;

2.2.5. Операция sizeof

sizeof – это унарная операция, возвращающая длину в байтах переменной или типа, помещенных в скобки. Например:

float f;

printf(“%d”, sizeof f);

printf("\n%d", sizeof(int));

выдает

4

2

Использование sizeof помогает создавать переносимый код для тех случаев, когда код зависит от размера стандартных типов данных Си.

2.2.6. Преобразование типов в выражениях

Когда переменные и константы различных типов смешиваются в выражениях, то происходит преобразование к одному типу. Компилятор преобразует все операнды к «старшему» типу. «Старшим» называется тип, диапазон представления у которого больше.

Последовательность типов, начиная с «младшего», и заканчивая «старшим», можно представить в следующем виде:

char -> int -> unsigned int -> long -> unsigned long -> float -> double -> long double.

Например, если один из операндов выражения имеет тип int, а другой – «старший» тип float, то всё выражение будет иметь тип float.

Рассмотрим пример преобразования типов.

Сначала символ ch преобразуется к типу int, а вещественная переменная f преобразуется к double. Затем выражение ch / i преобразуется к старшему типу double, поскольку выражение f * d имеет тип double. Конечный результат имеет тип double.

char ch;

int i;

float f;

double d;

result = (ch / i) + (f * d) – (f + i);

│ │ │ │ │ │

char int float double float int

└─┬──┘ └─┬─┘ └─┬─┘

int double float

└────┬─────────┘ │

double │

└───────────┬───────────┘

double