Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
mskoromets
6 / 6 / 3
Регистрация: 29.12.2016
Сообщений: 132
Завершенные тесты: 2
1

Написание своей функции swap()

24.03.2017, 18:56. Просмотров 1206. Ответов 14
Метки нет (Все метки)

Доброго времени суток. Решил написать свою функцию по смене местами переменных переменных.
Вот код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 #include <iostream>
#include <conio.h>
using namespace std;
 
void my_swap(int a, int b)  // две переменные меняются местами без
{                           // использования 3-ей переменной
    a = a + b;
    b = a - b;
    a = a - b;
}
 
int main()
{
    int x = 5;
    int y = 10;
    cout << "Before swap:" << endl;
    cout << "x = " << x << endl;
    cout << "y = " << y << endl;
    my_swap(x, y);
    cout << "After swap:" << endl;
    cout << "x = " << x << endl;
    cout << "y = " << y << endl;
    _getch();
    return 0;
Я так понимаю что все дело тут в области видимости переменных. Если это так то не могли бы вы предложить простой способ реализации этой функции?
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.03.2017, 18:56
Ответы с готовыми решениями:

Написание шаблонной функции swap
Добрый вечер, в качестве упражнения пытаюсь написать собственнную шаблонную функцию swap. Если...

Вновь о функции swap
Все мы знаем, что в стандартной библиотеке полно всяких разных вариантов swap, которые обменивают...

Шаблоны и переопределение функции swap
Есть у меня шаблонный класс, решил для него функцию swap написать: template &lt;typename T&gt; void...

Оптимизация кода функции swap для двусвязного списка
Написал функцию для обмена двух любых элементов двусвязного списка, рассмотрел все случаи, но мне...

Неизвестные функции динамических структур emplace, swap и _Get_container
Здравствуйте, работаю в студии 2017-го года. При работе со списком и стеком я наткнулся на функции...

14
GbaLog-
Любитель чаепитий
3181 / 1484 / 470
Регистрация: 24.08.2014
Сообщений: 5,226
Записей в блоге: 1
Завершенные тесты: 2
24.03.2017, 18:58 2
Сигнатуру функции на такую измените: void my_swap(int & a, int & b)
1
Undisputed
389 / 204 / 48
Регистрация: 10.06.2014
Сообщений: 1,913
Завершенные тесты: 3
24.03.2017, 19:01 3
mskoromets,
Передавайте ваши аргументы по ссылке. void my_swap(int& a, int& b)... вот так например
0
mskoromets
6 / 6 / 3
Регистрация: 29.12.2016
Сообщений: 132
Завершенные тесты: 2
24.03.2017, 19:02  [ТС] 4
GbaLog-, это указатели (просто совсем новичок)?
0
24.03.2017, 19:02
Aleksey19718
3 / 3 / 1
Регистрация: 20.12.2015
Сообщений: 47
24.03.2017, 19:17 5
это ссылки. Т.е. в функцию передается адрес переменных а не их значение
0
zss
Модератор
Эксперт С++
8337 / 7392 / 4593
Регистрация: 18.12.2011
Сообщений: 19,572
Завершенные тесты: 1
24.03.2017, 19:24 6
Лучший ответ Сообщение было отмечено mskoromets как решение

Решение

Цитата Сообщение от Aleksey19718 Посмотреть сообщение
в функцию передается адрес переменных
Реально, в коде, это реализуется через адрес.
Но так говорить нельзя.
Правильнее будет сказать "В функцию передаются сами переменные, а не их копии".
1
Байт
Эксперт C
20667 / 13158 / 2772
Регистрация: 24.12.2010
Сообщений: 27,695
24.03.2017, 19:28 7
Цитата Сообщение от mskoromets Посмотреть сообщение
все дело тут в области видимости переменных.
Не совсем так. Дело в способе передачи параметров. По значению или по ссылке.
0
MrGluck
Форумчанин
Эксперт CЭксперт С++
8128 / 4980 / 1436
Регистрация: 29.11.2010
Сообщений: 13,456
24.03.2017, 19:30 8
Цитата Сообщение от Aleksey19718 Посмотреть сообщение
в функцию передается адрес переменных
Это было бы верно если функция была объявлена с такой сигнатурой: void my_swap(int *, int *). Насчёт ссылок вы правы. Просто уточнение.
0
Байт
Эксперт C
20667 / 13158 / 2772
Регистрация: 24.12.2010
Сообщений: 27,695
24.03.2017, 19:39 9
Цитата Сообщение от zss Посмотреть сообщение
"В функцию передаются сами переменные, а не их копии".
Очень странная фраза. Помедитировал над ней, но понять так и не смог
Но возможно, это я такой тупой...

Добавлено через 8 минут
Как я понимаю, конструкции
C++
1
2
3
4
swap(int *a, int *b) { *a= ,,,, }
...
int a, b;
swap(&a, &b);
И
C++
1
2
3
4
swap(&a, &b) { a=... }
...
int a, b;
swap(a, b);
совершенно эквивалентны. И в том и другом случае в функцию передается ссылка (= адрес) на переменную a.
Просто первый вариант - классический, идущий еще от первоначального Си K&R
Второй был добавлен в Си++ "для удобства", для пущей выразительности
1
hoggy
Эксперт С++
7008 / 3220 / 659
Регистрация: 15.11.2014
Сообщений: 7,366
Завершенные тесты: 1
24.03.2017, 21:38 10
Цитата Сообщение от Байт Посмотреть сообщение
Но возможно, это я такой тупой...
возможно и так.

ссылка - всевдоним (альтернативное) имени переменной.
у одной и той же переменной может быть множество имен.

это уже раз наверное дцать обсуждалось на этом портале.

Цитата Сообщение от mskoromets Посмотреть сообщение
не могли бы вы предложить простой способ реализации этой функции?
использовать промежуточную 3ю переменную.
это наиболее эффективно с точки зрения экономичности и быстродействия,
чем то уг, что вы вытворяете с двумя.
1
Байт
Эксперт C
20667 / 13158 / 2772
Регистрация: 24.12.2010
Сообщений: 27,695
24.03.2017, 22:30 11
Цитата Сообщение от hoggy Посмотреть сообщение
ссылка - псевдоним (альтернативное) имени переменной.
у одной и той же переменной может быть множество имен.
Опять ничего не понял. Видать, не судьба!
0
hoggy
Эксперт С++
7008 / 3220 / 659
Регистрация: 15.11.2014
Сообщений: 7,366
Завершенные тесты: 1
24.03.2017, 22:35 12
Цитата Сообщение от Байт Посмотреть сообщение
Опять ничего не понял. Видать, не судьба!
передавая объект в функцию по ссылке,
мы говорим компилятору,
что нам не нужна копия объекта.
мы хотим работать с оригинальным.

действие над ссылкой внутри функции - есть действие над оригинальным объектом.

вообще все действия над ссылкой - есть действие над оригинальным объектом.

поскольку ссылка - лишь псивдоним имени,
а не сам объет, то у ссылки нельзя взять адрес.
его попросту не существует (потому что ссылка - не объект)
попытка взять адрес у ссылки - взятие адреса у оригинального объекта.
поскольку любые действия над ссылкой - есть действие над оригинальным объектом.

ссылка - как ярлык на рабочем столе.
1
Байт
Эксперт C
20667 / 13158 / 2772
Регистрация: 24.12.2010
Сообщений: 27,695
24.03.2017, 22:48 13
Цитата Сообщение от hoggy Посмотреть сообщение
действие над ссылкой внутри функции - есть действие над оригинальным объектом.
Это я понимаю. Давно уже. Но что передается функции? Что помещается в стек? Или передача параметров происходит не через стек, а как-то иначе? В си и в плюсах я как-то о других механизмах просто не слышал.
А если в стек поместить саму переменную (объект), то... сами понимаете...
Вот как это "физически" происходит - передача параметров по ссылке? На уровне работы с памятью. Что с памятью-то?
Может быть стек (кадр стека) освобождается в 2 приема? И вызывающая функция "слизывает" измененные вызываемой значения? Что ж, возможна и такая реализация.
1
hoggy
Эксперт С++
7008 / 3220 / 659
Регистрация: 15.11.2014
Сообщений: 7,366
Завершенные тесты: 1
24.03.2017, 22:54 14
Цитата Сообщение от Байт Посмотреть сообщение
Вот как это "физически" происходит - передача параметров по ссылке?
это - кухня компилятора.
к с++ отношения никакого не имеет.
1
daslex
1293 / 537 / 177
Регистрация: 02.08.2011
Сообщений: 2,756
24.03.2017, 23:22 15
А я бы сказал, что функции (пере)даётся возможность работать с переменными напрямую, без всяких интриг, сокрытых в недрах компилятора.

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

1
24.03.2017, 23:22
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.03.2017, 23:22

Создание своей функции
Всем привет =) скажите, как правильно передать в функцию значения массива? В моей функции должна...

Реализация своей функции getline
Здравствуйте! Не могу решить задачку. Постановка: Реализуйте функцию getline, которая считывает...

Как передать 2 значения своей функции?
// Отображает время #include &lt;iostream&gt; using namespace std; void time(int); int main() { ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru