Krótki listing z rzutowaniem

0

#include <iostream>
using namespace std;
void fun(int a, int b, int& c)
{
a = b = c = 1;
}
int main()
{
int a = 0, b = 0;
fun(a,b,a);
cout << a << b;
}

Proszę o wytłumaczenie dlaczego wynikiem jest: 10

3

zmieniles wartosc obiektowi a w main bo przekazales go przez referencje do funkcji a ona zmienia wszystkie zmienne na 1

wiec wyswietlasz 1 (jako a) i 0 (jako b bo nie przekazales jej jako referencji) bez spacji ani nowej lini. stad masz 10 (1 i 0)

ten kod nie ma nic wspolnego z rzutowaniem. NIC

0
int a = 0, b = 0;
cout << "Przed: a = " << a << " b = " << b << endl;
fun(a,b,a);
cout << "Po: a = " << a << " b = " << b << endl;
cout << "a i b wypisane razem bez spacji: " << a << b;
0

Przepraszam, faktycznie tu chodzi wyłącznie o referencję. Czyli w samej funkcji wszystkie zmienne otrzymują 1. Potem a na trzecim miejscu w wywołaniu funkcji dostaje wartość c. Wtedy a na pierwszym miejscu również dostaje wartość 1. Natomiast b otrzymuje nową wartość 0 i nie ma znaczenia, że był zapis int a=0. Dlaczego przy wywołaniu referencji b nie może otrzymać z powrotem wartości 1 (w końcu a=b=c=1 i przekazujemy 1 od prawej do lewej)? Dziękuję za odpowiedzi.

0
twonek napisał(a):
int a = 0, b = 0;
cout << "Przed: a = " << a << " b = " << b << endl;
fun(a,b,a);
cout << "Po: a = " << a << " b = " << b << endl;
cout << "a i b wypisane razem bez spacji: " << a << b;

Wiem, nie musiałeś ;)

0

skoro wiesz to po co sie pytasz? wtf? Ktos Ci pomaga a Ty piszesz "wiem nie musiales" wtf;o

2

Dla łatwiejszego zrozumienia zmienimy nazwy zmiennych.

void fun(int first, int second, int& third)

jedynie third jest przekazany przez referencję, więc cokolwiek zrobisz z first i second nie będzie miało to znaczenia poza funkcją, bo to są tylko kopie parametrów.

fun(a, b, a);

b zawsze będzie miało wartość 0 (tę, którą dostał przed wywołaniem funkcji), bo funkcja operuje na jego kopii. a się zmienia tylko dlatego, że jest trzecim parametrem, gdybyś zrobił tak:

fun(a, b, innazmienna);

to a też będzie miało wartość 0, funkcja operuje na kopii pierwszego parametru.

0
fasadin napisał(a):

skoro wiesz to po co sie pytasz? wtf? Ktos Ci pomaga a Ty piszesz "wiem nie musiales" wtf;o

Spokojnie, masz rację. Chodziło tylko o pomylenie 1 i 0 z "10" :P Z referencją dopiero zaczynam zabawę ale dzięki wam już rozumiem dlaczego jest taki wynik :)

0
twonek napisał(a):

Dla łatwiejszego zrozumienia zmienimy nazwy zmiennych.

void fun(int first, int second, int& third)

jedynie third jest przekazany przez referencję, więc cokolwiek zrobisz z first i second nie będzie miało to znaczenia poza funkcją, bo to są tylko kopie parametrów.

fun(a, b, a);

b zawsze będzie miało wartość 0 (tę, którą dostał przed wywołaniem funkcji), bo funkcja operuje na jego kopii. a się zmienia tylko dlatego, że jest trzecim parametrem, gdybyś zrobił tak:

fun(a, b, innazmienna);

to a też będzie miało wartość 0, funkcja operuje na kopii pierwszego parametru.

O takie wyjaśnienie mi chodziło. Dziękuję bardzo! :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1