- •1. Краткие теоретические сведения
- •1.4. Пустой оператор
- •1.5. Составной оператор (блок)
- •1.6. Операторы начала и конца программы
- •Int main()
- •1.7. Оператор return
- •1.8. Оператор присваивания
- •1.8.1. Множественное присваивание
- •1.8.2. Ошибки при присваивании
- •1.8.3. Не путайте операторы равенства и присвоения
- •1.8.4. Составные операторы присвоения
- •1.8.6. Присваивание значения при объявлении
- •1.9. Операторы ввода-вывода
- •1.10. Функции ввода и вывода
- •1.10.1. Функция printf
- •1.10.2. Функция scanf
- •1.11. Операторы потокового ввода и вывода
- •1.11.1. Использование cout для отображения вывода на экран
- •1.11.2. Использование cout для вывода чисел
- •1.11.3. Вывод нескольких значений одновременно
- •1.11.4. Использование специальных символов вывода
- •1.11.5. Другие специальные символы
- •1.11.5. Вывод восьмеричных и шестнадцатеричных значений
- •1.11.6. Вывод на стандартное устройство ошибок
- •1.11.7. Управление шириной вывода
- •1.11.8. Директива #define
- •1.11.9. Оператор потокового вывода cin
- •1.11.10. Второе знакомство с cin
- •1.11.11. Следите за ошибками переполнения
- •1.11.12. Следите за ошибками несовпадения типов
- •1.11.13. Чтение символьных данных
- •1.11.14. Чтение слов с клавиатуры
- •1.11.15. Чтение строковых данных
- •1.12. Комментарии. Использование пробелов
- •1.13. Линейный вычислительный процесс
- •1.16. Таблица выбора идентификаторов
- •2. Задание
- •2.10. Задания
- •2.10.1. Задание 1
- •2.10.2. Задание 2
- •2.10.3. Задание 3 (домашнее)
- •3. Выводы
- •4. Требование к отчету
- •5. Вопросы для самоконтроля
- •Литература
- •Оглавление
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 может привести к потере точности, большинство компиляторов выдает по этому поводу предупреждение.