Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Kiedy funkcje są wywoływane?

Ostatnio zmodyfikowano 2014-10-15 14:05
Autor Wiadomość
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?
C/C++
#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;
}
P-118433
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.
P-118436
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.
P-118440
Monika90
» 2014-10-14 07:40:29
Kolejność wartościowania podwyrażeń jest nieokreślona. Choć są wyjatki - np. argumenty operatorów && || , ?:
P-118456
SocrateZ
» 2014-10-14 08:10:39
Jeżeli już coś piszesz i łączysz operatorami do jednej linii, warto zobaczyć na kolejność wykonywania operatorów:

Dla C:
http://en.cppreference.com/w/c​/language/operator_precedence

Dla C++:
http://en.cppreference.com/w​/cpp/language​/operator_precedence
P-118457
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ę. 
P-118458
Monika90
» 2014-10-14 09:21:15
Piszę do Ciebie, akwes. Kolejność ma znaczenie.

C/C++
cout << "Suma " << suma( n );
wg gramatyki to jest to samo co
C/C++
( 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.
P-118460
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:
C/C++
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:
C/C++
( cout << "Obiekt (...)\n" ) <<(( fun_druga() ).opis() );

Autor opisał tutaj zachowanie nieokreślone jako określone?




 
P-118478
« 1 » 2
  Strona 1 z 2 Następna strona