При вводе большого значения a, происходит переполнение. Как дальше работает программа? На месте a,b возникают неверные значения. Что происходит с a?
/*
Разработка программы обмена местами двух целочисленных
ячеек памяти без использования дополнительный памяти.
Программа должна запросить у пользователя два целый числа, затем
выполнить реализованный алгоритм по шагам, показывая содержимое ячеек
памяти до первого шага и после каждого шага. Во время выполнения данного
алгоритма могут возникать целочисленные переполнения ячеек, при написании
алгоритма этот случай должен быть учтён.
*/
#include <iostream>
int main()
{
setlocale(LC_ALL, "Russian");
long a, b;
std::cout << "Введите целочисленное значение переменной a: ";
std::cin >> a;
std::cout << "\nВведите целочисленное значение переменной b: ";
std::cin >> b;
std::cout << "\nИзначальное значение a: " << a;
std::cout << "\nИзначальное значение b: " << b;
a = a + b;
std::cout << "\nЗначение a после первой операции: " << a;
b = b - a;
std::cout << "\nЗначение b после первой операции: " << b;
b = -b;
std::cout << "\nЗначение b после второй операции: " << b;
a = a - b;
std::cout << "\nЗначение a после второй операции: " << a;
std::cout << "\n\nЗначение a после обмена ячеек: " << a << std::endl;
std::cout << "Значение b после обмена ячеек: " << b << std::endl;
return 0;
}
Ответы (1 шт):
Вот описание того, как ведет себя оператор >> при вводе чего-то очень большого:
If extraction fails (e.g. if a letter was entered where a digit is expected), zero is written to value and failbit is set. For signed integers, if extraction results in the value too large or too small to fit in value,
std::numeric_limits<T>::max()orstd::numeric_limits<T>::min()(respectively) is written and failbit flag is set. For unsigned integers, if extraction results in the value too large or too small to fit in value,std::numeric_limits<T>::max()is written and failbit flag is set.
Т.е. у вас в a помещается std::numeric_limits<T>::max(), после чего устанавливается флаг fail, и дальнейшие чтения просто не выполняются. Т.е. в b будет тот мусор, который там был изначально.