Castowanie parametru funkcji i parametr referencyjny

0

Witam
Właśnie zagłębiam się w tematykę zmiennych referencyjnych oraz typu const i dla przykładu napisałem na brudno parę linijek kodu i jak jak to interpretuję. Moje pytanie po prostu brzmi czy moje przemyślenia na ten temat są słuszne.

void f1(float var){
}
void f2(float& var){
}
void f3(const float& var){
}

int main(){
   int a=8;
   float b=10.1;
   f1(a); // "a" jest rzutowane fo typu float i kopiowane do zmiennej var. Możliwość edycji zmiennej var bez wpływu na zmienną a
   f1(b); // var jest kopią zmiennej b. Możliwość edycji zmiennej var bez wpływu na zmienną b
   f1(1+2); wynik dodawania jest castowany do float i zapisywany do zmiennej var. Możliwość edycji zmiennej var

   f2(a); // bląd bo nie można zrobić referencji typu float ze zmiennej typu int
   f2(b); // &b == &var ???. Możliwość edycji zmiennej var i wpływa to na zmienną b
   f2(1+2); // błąd bo nie można zrobić referencji z wyrażenia

   f3(a); // zmienna var ma adres pamięci/stosu (????) z wynikiem rzutowania zmiennej a do float. Brak możliwości edycji wewnątrz funkcji zmiennej var
   f3(b); // &b == &var ??? z tym, że nie ma możliwości edycji zmiennej var;
   f3(1+2); // podobnie jak w f3(a) tylko, że zmienna var wskazuje na zapisany wynik działania gdzieś w pamięci
}

0

A próbowałeś to kompilować?

0

napisałem to wszystko z głowy bazując się na moich obserwacjach z zabawy kodem w moim projekcie. Na szybko napisałem coś bardzo podobnego i wszystko działa z wyjątkiem wspomnianych błędów, nawet adresy zmiennych pokrywają się z moimi przypuszczeniami. Nadal jednak jestem ciekaw czy dobrze interpretuję co kompilator robi z castowanymi elementami.

1

Jeśli chodzi o język C, to dywagacja na temat f2 i f3 nie ma sensu, bo te funkcje są w nim nielegalne. W przypadku f1 tworzona jest nowa zmienna tymczasowa var, inicjalizowana za pomocą podanego wyrażenia (czyli albo intem, albo floatem - wtedy będzie kopia - albo wyrażeniem, którego wynik jest intem)

0

Rzeczywiście, testowałem to na szybko w Arduino, jednak w CodeBlock używając jedynie c dostawałem błędy. Pomijając już czy to będzie c czy c++ to cała reszta będzie się zgadzać czy nadal coś pomijam?

0

Pytanie zadałeś z tagiem c ;​)

f2(a); // bląd bo nie można zrobić referencji typu float ze zmiennej typu int
// tak
f2(b); // &b == &var ???. Możliwość edycji zmiennej var i wpływa to na zmienną b
// tak
f2(1+2); // błąd bo nie można zrobić referencji z wyrażenia
// konkretnie - nie można zrobić nie-const l-referencji z wyrażenia

f3(a); // zmienna var ma adres pamięci/stosu (????) z wynikiem rzutowania zmiennej a do float. Brak możliwości edycji wewnątrz funkcji zmiennej var
// tak jak w f1, tworzona jest nowa zmienna tymczasowa typu float, i do niej const referencję dostajesz
f3(b); // &b == &var ??? z tym, że nie ma możliwości edycji zmiennej var;
// tak
f3(1+2); // podobnie jak w f3(a) tylko, że zmienna var wskazuje na zapisany wynik działania gdzieś w pamięci
// podobnie jak w f3(a)
0

mam tego świadomość ale bo miałem błędne założenia co do Arduino, dodatkowo nie do końca odróżniam jeszcze c i c++

1
smarq napisał(a):

nie do końca odróżniam jeszcze c i c++

To na razie porzuć C. :)

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