• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Jak zamienić x na y, y na x?

Object Storage Arubacloud
0 głosów
1,023 wizyt
pytanie zadane 22 lutego 2018 w C i C++ przez Furgix Początkujący (480 p.)
Przepraszam za temat. Nie wiem jak go sformułować

x=10

y=15

jak zrobic tak żeby x=15 a y=10

5 odpowiedzi

0 głosów
odpowiedź 22 lutego 2018 przez hhh Gaduła (4,110 p.)
wybrane 24 lutego 2018 przez Furgix
 
Najlepsza
x = x + y

y = x - y

x = x - y
komentarz 22 lutego 2018 przez Furgix Początkujący (480 p.)
Wytłumaczysz?
komentarz 22 lutego 2018 przez hhh Gaduła (4,110 p.)
Najpierw do zmiennej x (w tej chwili 10) przypisujemy sumę teraźniejszego x (10) i y (15).

Teraz, skoro dodaliśmy y do x, możemy nadpisać y, czyli wstawiamy tam x (25) i odejmujemy y (15). Na tym etapie mamy już gotowe y (10).

Teraz pora na odzyskanie x. Skoro teraźniejsze x (25) to suma pierwotnych x (10) i y (15), a my mamy gotowe y (10), to odejmując x od y (25 - 10) odzyskamy pierwotną wartość, czyli gotowe x (15).
komentarz 22 lutego 2018 przez monika90 Pasjonat (22,940 p.)
Tylko że ta metoda prowadzi do niezdefiniowanego zachowania z powodu przepełnienia arytmetycznego.
komentarz 22 lutego 2018 przez Beginer Pasjonat (22,110 p.)
Możesz to wyjaśnić?
komentarz 23 lutego 2018 przez monika90 Pasjonat (22,940 p.)
Dla 10 i 15 to zadziała, ale jeżeli x i y są typu int oraz, przykładowo, x jest równe INT_MAX, a y jest równe 1, to dojdzie do przepełnienia podczas obliczania x + y. Wartość INT_MAX + 1 jest za duża dla typu int. Przepełnienie prowadzi do niezdefiniowanego zachowania, co oznacza, że pogram może się zachować w zupełnie nieprzewidywalny sposób.
komentarz 24 lutego 2018 przez Beginer Pasjonat (22,110 p.)
Monika jest okay! Ale z takim ograniczeniem wielkości zmiennych trzeba się liczyć w każdej sytuacji, w każdej metodzie.
+2 głosów
odpowiedź 22 lutego 2018 przez MetGang Nałogowiec (34,360 p.)

Uwaga! Troll post (namówili mnie).

Istnieje wiele możliwych sposobów żeby dokonać tej prostej akcji, więc podsyłam jeden z nich (kod pisany na szybko). Na pierwszy rzut oka wygląda strasznie, ale potem jest tylko gorzej.

struct {
    template <typename T, auto... Is>
    auto operator () (T* Ptr1, T* Ptr2, T* Buffer, std::index_sequence<Is...>) const noexcept
    {
        ((Buffer[Is] = Ptr1[Is]), ...);
        ((Ptr1[Is] = Ptr2[Is]), ...);
        ((Ptr2[Is] = Buffer[Is]), ...);
    }
} inline constexpr Variadic;

inline constexpr auto swap = [](auto& First, auto& Second)
{
    static_assert(std::is_same_v<decltype(First), decltype(Second)>);

    constexpr auto TypeSize = sizeof(std::common_type_t<decltype(First), decltype(Second)>);
    auto FirstPtr = reinterpret_cast<char*>(std::addressof(First));
    auto SecondPtr = reinterpret_cast<char*>(std::addressof(Second));
    struct { char m_Buffer[TypeSize]; } Buffer;

    Variadic(FirstPtr, SecondPtr, reinterpret_cast<char*>(std::addressof(Buffer)), std::make_index_sequence<TypeSize>{});
};

int main()
{
    int x = 10;
    int y = 15;
    std::cout << x << ' ' << y << '\n'; // 10 15
    swap(x, y);
    std::cout << x << ' ' << y << '\n'; // 15 10
}

 

komentarz 22 lutego 2018 przez DragonCoder Nałogowiec (36,500 p.)
Kto Cie zmusil do tego karygodnego wyczynu? :P
3
komentarz 22 lutego 2018 przez MetRiko Nałogowiec (37,110 p.)

Towarzysze z projektu Szczur wink

komentarz 22 lutego 2018 przez mokrowski Mędrzec (155,460 p.)
Łe... bez fabryki? :-) "Cieńko"... :-)

I std::addressof nierozpisany :-) Dopiero by było fajnie. Może "bedom z Ciebie ludzie w Enterprajzie" :-)
komentarz 22 lutego 2018 przez Treners Początkujący (310 p.)

@MetGang, no to is_same czy common_t? ;)

+2 głosów
odpowiedź 22 lutego 2018 przez adrian17 Ekspert (345,160 p.)
std::swap(x, y);

 

+1 głos
odpowiedź 22 lutego 2018 przez Snejki Stary wyjadacz (14,520 p.)

hmm, użyć np. zmiennej pomocniczej temp, albo skorzystać ze swap

+1 głos
odpowiedź 22 lutego 2018 przez mokrowski Mędrzec (155,460 p.)
#include <iostream>

int main() {
    int x = 10;
    int y = 15;

    // (1) - IMHO najsensowniejsze...
    int tmp = x;
    x = y;
    y = tmp;
    std::cout << "(1) x = " << x << " y = " << y << '\n';

    // (2) - trik ale średnio wydajny...
    x ^= y;
    y ^= x;
    x ^= y;
    std::cout << "(2) x = " << x << " y = " << y << '\n';

    // (3) - ot taka ciekawostaka nie do końca zgodna z prawidłami :-)
    // Tu warn... 
    x ^= y ^= x ^= y;
    std::cout << "(3) x = " << x << " y = " << y << '\n';
}

 

Podobne pytania

0 głosów
2 odpowiedzi 232 wizyt
0 głosów
0 odpowiedzi 157 wizyt
pytanie zadane 24 sierpnia 2019 w C i C++ przez Ad19am94 Początkujący (440 p.)
0 głosów
1 odpowiedź 103 wizyt

92,614 zapytań

141,465 odpowiedzi

319,773 komentarzy

61,996 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...