Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка по основам алгоритмизации и программи....doc
Скачиваний:
41
Добавлен:
02.11.2018
Размер:
2.69 Mб
Скачать

Преобразование типов

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

1) char и short преобразуется в int, float - в double (в С(С++) все действия с вещественными числами производятся с двойной точностью). В С(С++) наряду с модификатором unsigned существует модификатор signed. Если он используется сам по

себе, то это равносильно signed int. Имеют место следующие преобразования:

char - int (со знаком),

unsigned char - int (старший байт всегда нулевой),

signed char - int (в знаковый разряд int передается знак из char),

short - int (знаковый или беззнаковый),

float - double;

2) enum преобразуется в int;

3) если один из операндов имеет тип double (long, unsigned), то другие преобразуются к double (long, unsigned) соответственно, результат будет иметь тип double (long, unsigned);

4) последовательность имен типов, упорядоченных от "высшего" типа к "низшему", имеет следующий вид: double, float, long, int, short, и char. Применение модификатора unsigned повышает ранг соответствующего типа данных со знаком.

"Повышение" типа обычно заканчивается успешно, в то время как "понижение" может закончиться не всегда успешно. Это связано с тем, что все число может не поместиться в элементе данных низшего типа.

#include<stdio.h>

void main(void)

{ char c; /* объявление cимвольной переменной */

int i; /* объявление переменной целого типа */

float f; /* объявление переменной вещественного типа */

f=i=c='C';

printf("c= %c, i= %d, f= %2.3f \n",c,i,f);

c=c+1; /*преобразования выполнятся успешно, т. к. размер-*/

i=f+c; /*ность памяти под переменными c, i, f достаточна*/

f=i/c; /*для размещ. в них значений вычисленных выраж. */

printf("c= %c, i= %d, f= %f \n",c,i,f);

c=3.67e17; /*для числа 3.67e17 требуется > 1 байта (ошибка)*/

printf("c= %c \n",c);

}

В С(С++) при вычислении все величины типа float преобразуются в тип double, что уменьшает вероятность погрешности при округлении. Конечный результат преобразуется к типу float (если это требуется).

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

Рассмотренные выше преобразования типов выполняются автоматически. Существует возможность точно указать тип данных, к которому необходимо привести (преобразовать) некоторое выражение (переменную). Это заключается в том, что перед приводимым к требуемому типу выражением ставится тип в круглых скобках: (тип) выражение. Например:

int i:

i=(int)3.4e-2+(int)’A’;

Вообще говоря, при разработке программ желательно не смешивать типы, во многих языках это запрещено. Однако в некоторых случаях этого избежать нельзя или это упрощает программу. В С(С++) вся ответственность за подобные преобразования ложится на программиста.

Операция запятая

В С(С++) любое выражение с оператором присваивания, заключенное в скобки, имеет значение, равное присваиваемому. Например, выражение (i=j+k) будет иметь значение суммы j+k. Использование скобок позволяет расширить смысл указанного выражения далее простого суммирования и присваивания полученного значения переменной i. Значение суммы присваивается также всему выражению, над которым здесь же может быть выполнена другая операция, например, операция сравнения ((i=j+k)<=n). Выражение в целом будет принимать значение FALSE или TRUE в зависимости от выполнения условия. Выражение в скобках может представлять собой сложное выражение, состоящее из более чем одной формулы. Для этого и используется операция запятая. Вычисления в таком выражении выполняются слева направо, и все выражение примет значение последней вычисленной формулы. Например (i=j+1,j+4), значение всего выражения будет равно 5.