- •3. Выражения и присваивания
- •3.1. Операнды и операции
- •3.2. Преобразования при вычислении выражений
- •3.3. Операции отрицания и дополнения
- •3.4. Операции разадресации и адреса
- •3.5. Операция sizeof
- •3.6. Мультипликативные операции
- •3.7. Аддитивные операции
- •3.8. Операции сдвига
- •3.9. Поразрядные операции
- •3.10. Логические операции
- •3.11. Операция последовательного вычисления
- •3.12. Условная операция
- •3.13. Операции увеличения и уменьшения
- •3.14. Простое присваивание
- •3.15. Составное присваивание
- •3.16. Приоритеты операций и порядок вычислений
- •3.17. Побочные эффекты
- •3.18. Преобразование типов
3.2. Преобразования при вычислении выражений
При выполнении операций производится автоматическое преобразование типов, чтобы привести операнды выражений к общему типу или чтобы расширить короткие величины до размера целых величин, используемых в машинных командах. Выполнение преобразования зависит от специфики операций и от типа операнда или операндов.
Рассмотрим общие арифметические преобразования.
1. Операнды типа float преобразуются к типу double.
2. Если один операнд long double, то второй преобразуется к этому же типу.
3. Если один операнд double, то второй также преобразуется к типу double.
4. Любые операнды типа char и short преобразуются к типу int.
5. Любые операнды unsigned char или unsigned short преобразуются к типу unsigned int.
6. Если один операнд типа unsigned long, то второй преобразуется к типу unsigned long.
7. Если один операнд типа long, то второй преобразуется к типу long.
8. Если один операнд типа unsigned int, то второй операнд преобразуется к этому же типу.
Таким образом, можно отметить, что при вычислении выражений операнды преобразуются к типу того операнда, который имеет наибольший размер.
Пример:
double ft,sd;
unsigned char ch;
unsigned long in;
int i;
....
sd=ft*(i+ch/in);
При выполнении оператора присваивания правила преобразования будут использоваться следующим образом. Операнд ch преобразуется к unsigned int (правило 5). Затем он преобразуется к типу unsigned long (правило 6). По этому же правилу i преобразуется к unsigned long и результат операции, заключенной в круглые скобки будет иметь тип unsigned long. Затем он преобразуется к типу double (правило 3) и результат всего выражения будет иметь тип double.
3.3. Операции отрицания и дополнения
Операция арифметического отрицания (-) вырабатывает отрицание своего операнда. Операнд должен быть целой или плавающей величиной. При выполнении осуществляются обычные арифметические преобразования.
Пример:
double u = 5;
u = -u; /* переменной u присваивается ее отрицание,
т.е. u принимает значение -5 */
Операция логического отрицания "НЕ" (!) вырабатывает значение 0, если операнд есть истина (не нуль), и значение 1, если операнд равен нулю (0). Результат имеет тип int. Операнд должен быть целого или плавающего типа или типа указатель.
Пример:
int t, z=0;
t=!z;
Переменная t получит значение равное 1, так как переменная z имела значение равное 0 (ложно).
Операция двоичного дополнения (~) вырабатывает двоичное дополнение своего операнда. Это означает, что каждый бит со значением 1 получает значение 0 и наоборот. Операнд должен быть целого типа. Осуществляется обычное арифметическое преобразование, результат имеет тип операнда после преобразования.
Пример:
char b = '9'; // Код ASCII символа '9' равен 57
unsigned char f;
f = ~b; //
Шестнадцатеричное значение символа '9' равно 39. Двоичное значение 00111001. В результате операции ~b будет получено двоичное значение 11000110 или шестнадцатеричное значение С6, что соответствует символу 'ц' в коде ASCII.