функция
Не подскажите есть ли в любом языке программирования функция меняющая значения двух переменных местами:
a=b
b=с
с=a
То есть без использования вспомогательной переменной (понятно что в вспомогательной функции она и так используется)
Прошу не говорить, что такую функцию легко написать и прочее.
Что значит в любом? Надо про конкретный говорить. В одном языке так делается, например:
a, b = b, a
a, b = b, a
а в другом
b=a-b;
a=a-b;
я решил попытать данную функцию:
#include <limits>
#include <typeinfo>
using namespace std;
template<typename T> void NumSwap(T& x, T& y)
{
x += y;
y = x - y;
x -= y;
}
template<typename T> void test(size_t n, bool showAllGoods = false)
{
T min = numeric_limits<T>::min();
T max = numeric_limits<T>::max();
T step = max / static_cast<T>(n);
cout << typeid(T).name() << " => ";
for(T i = min, j = max; j >= step; i += step, j -= step)
{
T a = i;
T b = j;
NumSwap(a, b);
if(showAllGoods)
cout << i << ", " << j << ", " << a << ", " << b << endl;
if((a == j) && (b == i)) continue;
cout << "bad test for: "
<< i << ", " << j << ", " << a << ", " << b << endl;
return;
}
cout << "good test" << endl;
}
int main()
{
test<int>(20);
test<unsigned int>(20);
test<char>(10, true);
test<float>(20);
test<double>(20);
return 0;
}
С float и double не проходит при использовании моего компилятора. Прошло бы, если бы я внес допустимую погрешность, но это будет не корректно.
b=a-b;
a=a-b;
Мало ли чего сказано - я пытаюсь вначале понять, потом еще и потестировать на случай, если понял неправильно. Для чисел с плавающей запятой метод тоже подходит, если допустимо некоторое смещение.
Переполнение будет вредить, если оно будет вызывать исключение или прерывание. В ином случае все будет работать как и без переполнения.
Кстати, мой тест симметричен и этот момент упускает. Надо ввести дополнительные циклы...
Ну и для тех кто не потрудился тицнуть по ссылке - там есть и лутшее решение с XOR которое подойдет в любом случае если переменные одинаковой длинны.
Ну и для тех кто не потрудился тицнуть по ссылке - там есть и лутшее решение с XOR которое подойдет в любом случае если переменные одинаковой длинны.
Неа... "в любом случае" не подойдет, даже если одинаковой длины.
;) Green уже второго человека поймал на неприменимости xor для любого случая (первый раз в этой теме).
Спасибо конечно за поддержку, но в даном случае признаю свою ошибку и щитаю что лутше недобдеть чем перебдеть. Ибо наличие такой функции в библиотеке может привести к трудноотслеживаемим и редко возникающим ошибкам.
Ну, в общем-то ты единственный кто мог точно ответить на мой вопрос :). А с остальным, конечно, согласен. Просто порой при таких задачках нужна не сама функция а нужно то "что хочет преподаватель", посему важен и общий контекст в котором возник вопрос.
А что значит "переменные одинаковой длины"?
int и char[4] - это переменные одинаковой длины?
Что значит "если речь идет о числах"?
float - это ведь тоже число?
int и char[4] - это переменные одинаковой длины?
Согласен, нехорошо сформулировано. Правда и std::swap() такое не меняет.
Что значит "если речь идет о числах"?
float - это ведь тоже число?
Да, это не Rebbit-а формулировка. Поэтому я в итоге и сказал что точно ответить как он это понял может только он :).