Раздел 11
Оператор присваивания и
приведение данных
Оператор присваивания ранее уже использовался. Здесь остановимся на
некоторых особенностях этого оператора. Главная особенность оператора
присваивания в С++ состоит в том, что он возвращает значение. Это
означает, что выражение с оператором присваивания может, в свою
очередь, быть частью другого выражения. Синтаксис использования
оператора присваивания таков: переменная
=
выражение. При этом в качестве значения присваивается
результат, возвращаемый при вычислении выражения.
Результат выражения является тем значением, которое возвращает оператор
присваивания. Поэтому помимо обычных присваиваний вида n = 5
допускается многократное использование оператора присваивания в
выражениях.
Например, вполне законной является инструкция вида x = y = z = 3, в
результате выполнения которой переменным x, y и z присваивается
значение 3.
Инструкции могут быть и более замысловатыми. В листинге 1.6
целочисленным переменным n и m командой n = (m = 6) + 3 присваиваются
значения 9 и 6 соответственно.
==========>Листинг
1.6
Оператор
присваивания
#include <iostream>
using namespace std;
int main(){
int n,m;
n=(m=6)+3;
cout<<"m = "<<m<<"\n";
cout<<"n = "<<n<<"\n";
cout << "Конец задания для самостоятельной работы!" << endl;
system ("pause");
//
ожидаем
нажатия
кнопки
return 0;
}
==========>Конец Листинга 1.6 Компилированный
исполняемый файл листинга 1.6(120Кб, rar)
В соответствии с приведенной командой сначала вычисляется выражение m=6,
значением
которого
является
6,
и
при
этом
такое
же
значение
присваивается
переменной
m. Далее к этому значению прибавляется
число 3 и результат присваивается переменной n.
Еще одна особенность оператора присваивания связана с преобразованием
типа в выражениях, содержащих этот оператор. Если в инструкции вида переменная = выражение тип
результата, возвращаемого выражением,
не
совпадает
с
типом
переменной
, имеет место автоматическое преобразование типов.
При этом тип значения выражения
приводится в соответствие с типом переменной.
Результат такой операции существенно зависит от того, из какого в какой
тип данных осуществляется преобразование. В некоторых случаях может
иметь место потеря данных: например, если переменной типа int
присваивается значение переменной типа double, как в листинге 1.7
==========>Листинг
1.7(См.
примечание)
Автоматическое
преобразование
типов
при
присваивании
значения
#include <iostream>
using namespace std;
int main(){
int a;
double x=3.5;
a=x;
cout<<"x="<<x<<"\n";
cout<<"a="<<a<<"\n";
cout << "Конец задания для самостоятельной работы!" << endl;
system
("pause");
//
ожидаем
нажатия
кнопки
return 0;
}
==========>Конец Листинга 1.7 Компилированный
исполняемый файл листинга 1.7(120Кб, rar)
В программе объявляется целочисленная переменная a типа int и
инициализируется переменная x типа double со значением 3.5. Далее в
программе переменной a в качестве значения присваивается переменная x.
В данном случае речь идет о том, что переменной типа int присваивается
значение типа double. Поскольку диапазон значений для типа double шире
диапазона значений для типа int, происходит урезание значения
В частности, при присваивании отбрасывается дробная часть числа, и
переменная a получает значение 3
Если бы переменной типа double присваивалось значение типа int, таких
проблем не возникало бы.
Преобразование типов может проявляться и совершенно по-иному. В
листинге 1.8 приведен пример кода программы, в которой типа char
присваивается значение типа int.
==========>Листинг
1.8
Преобразование
int-типа
в
char-тип.
#include <iostream>
using namespace std;
int main(){
char x;
int n=68;
int z;
x=n;
z='D';
cout<<"x="<<x<<"\n";
cout<<"z="<<z<<"\n";
cout << "Конец задания для самостоятельной работы!" << endl;
system
("pause");
//
ожидаем
нажатия
кнопки
return 0;
}
==========>Конец Листинга 1.8 Компилированный
исполняемый файл листинга 1.8(120Кб, rar)
Целочисленной переменной n типа int присваивается значение 68. Далее
эта переменная присваивается в качестве значения переменной x
char-типа. В результате автоматического преобразования типов переменная
х, в соответствии с кодовой таблицей, получает символьное значение D. В
этом же программном коде проиллюстрирована обратная процедура: командой
z='D' целочисленной переменной z присваивается в качестве значения
символ D. В результате автоматического преобразования символов этой
переменной на самом деле будет присвоен целочисленный код символа в
кодовой таблице(значение 68).
Автоматическое приведение типов в некоторых случаях может проявляться
достаточно неожиданным способом. Например, если операндами при делении
являются целые числа, выполняется целочисленное деление. Допустим, в
программе объявлены переменные int n = 13, m = 5. Результатом выражения
n/m является число 2(целая часть от деления 13 на 5). Для явного
приведения типа выражения тот тип, к которому следует привести
выражение, указывается в круглых скобках перед выражением. Чтобы в
приведенном примере деление было обычным, не целочисленным, можно
воспользоваться командой (double) n/m. В результате подучим 2.6.
|