Доступ к готовым решениям

Переход в группу "Пользователь"

300.00 ₽
Одноразовый платёж
Быстрый переход в группу "Пользователи", без надобности написания постов и ожидания.

Покупка дает возможность:
Быть полноправным участником форума
Нормальное копирование кода
Создавать темы
Скачивать файлы
Доступ к архиву Pawno-Info

Урок Как поменять местами значения между двумя переменными, не создавая лишних?

Pawn.Offic3r

Ученик
Здравия желаю, г-да и дамы. В этом уроке я приведу несколько простых примеров, как поменять местами значения между двумя переменными.
(Совет: желательно вспомнить математику за 5 класс)

Сразу укажу на два, очевидных для новичков, но неправильных примера:
Код:
main()
{
    new
        a = 5,
        b = 7;

    // Способ 1.
    printf("[Исходные данные] a = %d, b = %d", a, b);
    printf("[Итоговые данные] a = %d, b = %d", a = b, b = a);
    // Мы получим: a = 5, b = 5;

    a = 5;
    b = 7;

    // Способ 2.
    a = b;
    b = a;

    printf("[Исходные данные] a = %d, b = %d", a, b);
    printf("[Итоговые данные] a = %d, b = %d", a, b);
    // Итог: a = 7, b = 7.
}
Пример 1.
Код:
// Формула 1
a = a + b - (b = a)

// Упрощая:
a = a + b;
b = a - b;
a = a - b;

// Проверим на практике.
main()
{
    new
        a = 5,
        b = 7;

    printf("[Исходные данные] a = %d, b = %d", a, b);
    printf("[Итоговые данные] a = %d, b = %d", a + b - (b = a), b);
    // Итог: a = 7, b = 5.
}
Но заменив действия на противоположенные (!), вот что мы увидим:
Код:
main()
{
    new
        a = 5,
        b = 7;

    printf("[Исходные данные] a = %d, b = %d", a, b);
    printf("[Итоговые данные] a = %d, b = %d", a - b + (b = a), b);
    // Итог: не получилось, т.к. a = 3, b = 5.
}
Пример 2.
Код:
// Формула 2.
a * b / (b = a)

// Упрощая:
a = a * b;
b = a / b;
a = a / b;

// Проверим на практике.
main()
{
    new
        a = 5,
        b = 7;

    printf("[Исходные данные] a = %d, b = %d", a, b);
    printf("[Итоговые данные] a = %d, b = %d", a * b / (b = a), b);
    // Итог: a = 7, b = 5.
}
Однако (!), если мы попробуем заменить действия на противоположенные, у нас ничего не получится.
Код:
main()
{
    new
        a = 5,
        b = 7;

    printf("[Исходные данные] a = %d, b = %d", a, b);
    printf("[Итоговые данные] a = %d, b = %d", a / b * (b = a), b);
    // В итоге мы получим не то, чего хотели: a = 0, b = 5;
}
Пример 3 (Pa4enka)
Код:
// Формула 3.
a ^= b;
b ^= a;
a ^= b;

// Проверим на практике
main()
{
    new
        a = 5,
        b = 7;
    
    printf("[Исходные данные] a = %d, b = %d", a, b);
    
    a ^= b;
    b ^= a;
    a ^= b;
    
    printf("[Итоговые данные] a = %d, b = %d", a, b);
}
Пример 4 (SooBad)
Код:
stock swap(&var1, &var2)
{
     #emit lref.s.pri var1
     #emit lref.s.alt var2
     #emit sref.s.pri var2
     #emit sref.s.alt var1
}

// Проверим на практике
main()
{
    new
        a = 5,
        b = 7;
    
    printf("[Исходные данные] a = %d, b = %d", a, b);
    
    swap(a, b);
    
    printf("[Итоговые данные] a = %d, b = %d", a, b);
}
Если есть еще способы - пишите, добавлю.
Спасибо за внимание.
 
Последнее редактирование:
Сверху Снизу