#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
#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
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
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;
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.
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ś ;)
skoro wiesz to po co sie pytasz? wtf? Ktos Ci pomaga a Ty piszesz "wiem nie musiales" wtf;o
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.
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 :)
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! :)