Преобразование типов операндов арифметических операций

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

Типы операндов преобразуются в порядке увеличения их "размера памяти", т.е. объема памяти, необходимого для хранения их значений. Поэтому можно говорить, что неявные преобразования всегда идут от "меньших" объектов к "большим". Схема выполнения преобразований операндов арифметических операций:

short, char ® int ® unsigned ® long ® double

float ® double

Горизонтальные стрелки отмечают преобразования даже однотипных операндов перед выполнением операции, т.е. действуют следующие правила:

- значения типов char и short всегда преобразуются в int;

- если любой из операндов (a или b) имеет тип double, то второй преобразуется в double;

- если один из операндов long, то другой преобразуется в long.

Внимание: результатом 1/3 будет «0», чтобы избежать такого рода ошибок необходимо явно изменять тип хотя бы одного операнда, т.е. записывать, например: 1. / 3.

Типы char и int могут свободно смешиваться в арифметических выражениях. Каждая переменная типа char автоматически преобразуется в int. Это обеспечивает значительную гибкость при проведении определенных преобразований символов.

При присваивании значение правой части преобразуется к типу левой, который и является типом результата. И здесь необходимо быть внимательным, так как при некорректном использовании операций присваивания могут возникнуть неконтролируемые ошибки. Так, при преобразовании int в char старший байт просто отбрасывается.

Если объявлены: float x; int i; то как x=i; так и i=x; приводят к преобразованиям. При этом float преобразуется в int отбрасыванием дробной части.

Тип double преобразуется во float округлением.

Длинное целое преобразуется в более короткое целое и переменные типа char посредством отбрасывания лишних битов более высокого порядка.

При передаче данных функциям также происходит преобразование типов: в частности, char становится int, а float - double.

Операция приведения типа

В любом выражении преобразование типов может быть осуществлено явно. Для этого достаточно перед любым выражением поставить в скобках идентификатор соответствующего типа.

Вид записи операции: (тип) выражение;

Ее результат - значение выражения, преобразованное к заданному типу представления.

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

Например:

float x;

int n=6, k=4;

1) x=(n+k)/3; - дробная часть будет отброшена

2) x=(float)(n+k)/3; - использование операции приведения типа здесь позволяет избежать округления результата деления целочисленных операндов.

Также использование операции преобразования типа может оказаться полезным, если нужно преобразовать фактический параметр к типу соответствующего формата параметра функции. Функции exp, log, sqrt из стандартной библиотеки математических функций рассчитаны на параметр типа double и дают результат типа double. Если нужно получить натуральный логарифм от значения переменной x типа float нужно написать: log (( double) x).

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

== - равно или эквивалентно;

!= - не равно;

< - меньше;

<= - меньше либо равно;

> - больше;

>= - больше либо равно.

Пары символов соответствующих операций разделять нельзя.

Общий вид операций отношений:

<выражение1> <знак_операции> <выражение2>

Общие правила:

- операндами могут быть любые базовые (скалярные) типы;

- значения операндов после вычисления перед сравнением преобразуются к одному типу;

- результат операции отношения - целое значение 1, если отношение истинно, или 0 в противном случае. Следовательно, операция отношения может использоваться в любых арифметических выражениях.

Логические операции

Перечень логических операций в порядке убывания относительного приоритета и их обозначения:

! - отрицание (логическое НЕТ);

&& - коньюнкция (логическое И);

|| - дизьюнкция (логическое ИЛИ).

Общий вид операции отрицания:

!<выражение>

Общий вид операций коньюнкции и дизьюнкции

<выражение1> <знак_операции> <выражение2>

Например:

y>0 && x=7 ® истина, если 1-е и 2-е выражения истинны;

e>0 || x=7 ® истина, если хотя бы одно выражение истинно.

Ненулевое значение операнда трактуется как "истина", а нулевое - "ложь".

Например:

!0 ® 1

!5 ® 0

x=10;

!((x=y)>0) ® 0

Особенность операций коньюнкции и дизьюнкции – экономное последовательное вычисление выражений-операндов:

<выражение1> <операция><выражение2>,

- если выражение1 операции коньюнкция ложно, то результат операции - ноль и выражение2 не вычисляется;

- если выражение1 операции дизьюнкция истинно, то результат операции - единица и выражение2 не вычисляется.

Таким образом, появляется возможность записью логического выраже­ния задать условную последовательность вычисления выражений в направлении слева направо:

scanf("%d",&i) && test1(i) && test2(i) ® нулевой результат одной из функций приведет к игнорированию вызова остальных;

search1(x) || search2(x) || search3(x) ® только ненулевой результат одной из функций приведет к игнорированию вызова остальных.

Пример правильной записи двойного неравенства:

0<x<100 « (0<x)&&(x<100)

Наши рекомендации