wilkoo13 Temat założony przez niniejszego użytkownika |
Kiedy funkcje są wywoływane? » 2014-10-13 21:52:54 Kiedy funkcja jest wywoływana? Aby sprawdzić kiedy, "cout << "Funkcja uzyta" << endl;" pokaże mi gdy zostanie wykonana. Z tego co pamiętam funkcję wywołujemy dopiero gdy wpiszemy w ciele int main jej nazwe. A tutaj zostaje wykonana zaraz po wpisaniu liczby n. Czemu tutaj tak działa? #include <iostream> #include <cstdlib> using namespace std;
int suma( int n ) { if( n < 1 ) return 0; cout << "Funkcja uzyta" << endl; return n + suma( n - 1 ); }
int main() { int n; cout << "Podaj liczbe: "; cin >> n; cout << "Suma " << n << " kolenych liczb naturalnych wynosi: " << suma( n ) << endl; system( "pause" ); return 0; } |
|
pekfos |
» 2014-10-13 21:59:05 C++ nie określa, w jakiej kolejności są obliczanie wartości użyte w jednym wyrażeniu. Jak chcesz, by najpierw było wypisane "Suma bla bla wynosi:" a potem "Funkcja użyta", to wypisuj suma(n) oddzielnie. |
|
akwes |
» 2014-10-13 22:23:55 @pekfos, nie pomyliło Ci się to, z kolejnością obliczania argumentów funkcji? Tutaj udział biorą operatory i ich priorytety.
|
|
Monika90 |
» 2014-10-14 07:40:29 Kolejność wartościowania podwyrażeń jest nieokreślona. Choć są wyjatki - np. argumenty operatorów && || , ?: |
|
SocrateZ |
» 2014-10-14 08:10:39 |
|
akwes |
» 2014-10-14 08:45:56 @Monika90, Nie jestem pewien czy piszesz do mnie czy do autora tematu :P
Bo w tym przypadku jest to nieistotnie, kolejność nie ma tutaj żadnego znaczenia a tym bardziej nieokreśloność tejże kolejności. Aby napis "Suma..." został wypisany muszą być obliczone wszystkie podwyrażenia (nie ważne w jakiej kolejności) i to jest powód dlaczego napis "Funkcja użyta..." jest przed napisem "Suma...".
Chyba, że naprawdę czegoś tutaj nie widzę. |
|
Monika90 |
» 2014-10-14 09:21:15 Piszę do Ciebie, akwes. Kolejność ma znaczenie. cout << "Suma " << suma( n );
wg gramatyki to jest to samo co ( cout << "Suma " ) <<( suma( n ) );
Nie jest określone czy najpierw będzie obliczony lewy argument drugiego operatora << czy prawy. Jeżeli najpierw będzie obliczony lewy, to napis "Suma " pojawi się przed napisami wyprodukowanymi przez funkcję suma. Jeżeli najpierw zostanie obliczony prawy, to będzie odwrotnie. Jedyne co wiadomo to to że wartość zwrócona z fukcji suma będzie zapisana do strumienia na końcu, ponieważ zapisywana jest przez drugi operator <<, a nie da się go wykonać dopóki nie obliczy się wartośći jego argumentów. |
|
akwes |
» 2014-10-14 20:45:13 @Monika90, oczywiście masz rację. Powiem więcej, wiem dlaczego gadałem takie bzdury! :) W przypadku innych operatorów nawet bym się nie zastanawiał a tu proszę, o, takie herezje. Chyba, że dalej jestem zamotany i... Dlatego dopytam dokładnie aby rozwiać demony dzieciństwa. W Symfonii C++ (oraz u mojego wykładowcy, który prowadzi z niej wykłady, które mimowolnie muszę słuchać) pojawia się dział 15.9.3, który wprowadził mnie w błąd. I nie wiedzieć dlaczego ale specjalnie traktowałem operator "<<". Rozdział mówi o tym dlaczego wynikiem kodu: cout << "Obiekt (...)\n" <<( fun_druga() ).opis();
będzie: [string wypisany w fun_druga()]\n Obiekt (...)\n[wartosc zwrocona przez opis()]\n
Rozumiem, że w tym przypadku następuje dokładnie taka sama sytuacja? Czyli: ( cout << "Obiekt (...)\n" ) <<(( fun_druga() ).opis() );
Autor opisał tutaj zachowanie nieokreślone jako określone? |
|
« 1 » 2 |