Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛР5-С++-22 марта-2012.doc
Скачиваний:
12
Добавлен:
15.09.2019
Размер:
1.48 Mб
Скачать

1.8.1. Множественное присваивание

Иногда нужно вычислить значение выражения и присвоить его не одной, а нескольким переменным. Язык С++ допускает множественное присваивание – присваивание одного значения набору переменных в одном операторе. При этом операции выполняются справа налево.

Множественное присваивание – присваивание одного и того же значения нескольким переменным. В подобных случаях имеет место другой тип оператора присваивания

V1=V2=V3=…VN=E;

Пример 5.6.

a=b=c=d=1;

Это эквивалентно следующей последовательности операторов присваивания:

d = 1;

c = d;

b = c;

a = b.

Пример 5.7.

Вместо выполнения следующей совокупности операторов:

X= 0;

У = 0;

Z=0;

присваивающих значение 0 (ноль) пе­ременным X, У, Z , можно записать оператор вида

X=У=Z= 0;

Описатели типа переменных V1=V2=V3=…VN могут не совпадать. При выполнении этого типа оператора присваивания производятся следу­ющие действия:

1. Вычисляется значение выражения Е, содержащееся в правой части оператора.

2. Значение правой части оператора преобразуется в соответствии с описателями переменной Vi ( i = 1, 2, …, n), если описатели этой переменной не совпадают с характеристиками значения Е, с последующим присвоением его переменной Vi.

1.8.2. Ошибки при присваивании

В операторе присваивания типы значений переменной V и выражения Е в общем случае могут быть разными. Результат присвоения сохраняется в левом операнде, а типом результата являет­ся тип левого операнда.

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

ival = 0; // результат: тип int, значение 0

ival = 3.14159; // результат: тип int, значение 3

В обоих этих случаях осуществляется присвоение значения переменной типа int. В первом случае переменная ival получит то же значение, которое указано в правом операнде. Во втором случае переменная ival получит значение, отличное от правого операнда.

Рассмотрим еще один пример, где переменной ival типа int присваивается зна­чение 6.

int ival = 0;

ival = 3.541 + 3; // обычно приводит к предупреждению

// при компиляции

Здесь операндами оператора суммы являются значения двух разных типов: 3.541 – литерал типа double, а 3 – литерал типа int. Вместо попытки сложить значения двух разных типов, компилятор С++ предпримет ряд преобразований и приводит сначала операнды к общему типу. Эти преобразования осуществляются компилятором автоматически, без вмешательства программиста (а иногда и без его ведома). Поэтому такое преобразование типов называют неявным.

Преобразования между встроенными арифметическими типами осуществляются по возможности точно. Чаще всего, если в выражении используются целочисленные значения и значения с плавающей запятой, целое число преобразуется в число с пла­вающей запятой. В рассматриваемом примере целочисленное значение 3 преобразу­ется в тип double. После сложения получается результат 6.541 типа double.

На следующем этапе полученное значение типа double следует присвоить пере­менной ival типа int. В случае присвоения, тип левого операнда доминирует, по­скольку его невозможно изменить. Когда типы левого и правого операндов операто­ра присвоения не совпадают, значение правой стороны приводится к типу левой. Здесь значение типа double преобразуется в значение типа int. В ходе этого пре­образования значение типа double усекается до значения типа int, а десятичная часть отбрасывается. Таким образом, значение 6.541 преобразуется в значение 6, которое и присваивается переменной ival. Поскольку преобразование типа double в тип int может привести к потере точности, большинство компиляторов выдает по этому поводу предупреждение.