Операции присваивания. Прочие операции
Это операции =, +=, -=, *= и так далее. Их трактовка следующая – если е1 и е2 выражения и ор-операция, то е1 ор = е2
эквивалентно
е1 = е1 ор е2
Такое представление дает возможность получать более надежную программу за счет исключения ошибок при переписывании идентификаторов.
Пример.
int arr1[20];
……………
arr[i]*=a*2;
Что эквивалентно:
arr1[i]=arr1[i]*a*2;
1) Это легко можно было потерять при набивке.
2) Запись короче.
Тип операции присваивания – тип левого операнда. Аргументы
функций преобразовываются в соответствии с правилами приведения типов арифметических выражений. Поэтому аргументы функции должны быть описаны как int и double , в том случае, если фактические параметры типа char и float. Это правило можно обойти, если использовать прототипы функций, о которых далее. Использование прототипа это фактически размещение перед параметром операции (тип) в вызовах функций.
Прочие операции
Сюда относятся, прежде всего, поразрядные логические и сдвиговые операции. Они неприменимы к любым типам с плавающей точкой:
&-поразрядное И;
| - поразрядное ИЛИ;
^ - поразрядное исключающее ИЛИ;
<< - сдвиг влево;
>> - сдвиг вправо;
~ - обращение (унарная операция).
Работа с разрядами необходима, когда проверяются разряды регистров состояний каких-либо устройств или процессора.
Примеры
i = i&077; Выделяются младшие из разрядов, а все старшие разряды
устанавливаются в 0.
MASK= 0101;
x = x |MASK; Устанавливаются в “1” те разряды в х, которым
соответствуют 1 вMASK, а остальные неизменны.
k = 01;
O =017;
Y = k ^ O; В результате у = 016.
Операции сдвига << и >> выполняют сдвиг левого операнда влево или вправо на число, разрядов, задаваемое правым операндом.
7<
7>>5 результат 0.
При сдвиге вправо возможно размножение знака, то есть отрицательное число, представленное 1 в знаковом разряде, начнет “размножать” единицу знака в правые разряды.
Операция ~ - унарная, она инвертирует любой двоичный разряд.
Пример.
Считается, что x&~077 предпочтительнее, чем x&0177700, поскольку последняя запись жестко ориентирована на 16 разрядное слово, но х может быть и типа long. X&~077 дает в результате младшие 6 разрядов в нуле, а остальные неизменными.
Операции “sizeof” и запятая “,” используются соответственно для определения длины объекта в байтах и перечисления выражений не нарушая семантики операторов.
Пример
char *ptr;
ptr = (str*)calloc(numb,sizeof(str));
Функция callloc() возвращает указатель типа char*, который ссылается на выделенную для размещения данных heap-память. В запросе указано число numb элементов и размер каждого. Предполагается, что str – имя типа (например, структурного).
Если указано выражение вида …е1, е2, е3…, то последнее е3 определяет результат этой последовательности. Это можно использовать в программе, например, следующим образом :
for (i=A, j=B, k = C; i<j; i++, j--)
{
p[i] = p[j];
……………..
}
Здесь в цикле используется одновременно 2 переменные цикла i и j. Кроме того, независимо от них инициализируется переменная k.
Вопросы для самоконтроля
- Что означает тип unsigned?
- Допустимы ли в Турбо с 2-символьные константы?
- Какого типа следующие константы – 5.6e-7, 5.6E-7f?
- Что означает термин «константное выражение»?
- Перечислите классы памяти в языке С!
- Особенности инициализации классов памяти?
- В каких случаях применяется тип void?
- Приоритеты каких операций выше-ниже: арифметических, логических, сравнения?
- Как выглядят и выполняются побитовые логические операции и сдвиговые операции?
- Каковы особенности выполнения автоинкрементных операций?
Вопросы для самостоятельного изучения
- Как записываются в программе литерные строки (строковые литералы)?
- Как декларируются переменные перечислимого типа, как инициализируются символьне константы этого типа и какие операции применимы к указаному типу даннях?
Дата добавления: 2016-05-26; просмотров: 1308;