@smsrampage: a to nie zależy od tego czy argumenty są pchane FILO czy FIFO? przy domyślnym sposobie wołania funkcji to od prawej do lewej, z tego co z debugowania wyszło.
@biczek: no sprawdzić mogę ale jaką mam pewność, że to jest częścią specyfikacji i będzie takie samo przy każdym... no i @kolesnikov: odpowiedział i ALE BY BYŁO! :) Dzięki.
@smsrampage: było na wykładzie :) UJ pozdrawia. Było też wspomniane, że w większości przypadków będzie to od prawej do lewej wykonane, ale nie jest to pewnikiem.
@kolesnikov: na moich wykładach też pewnie było ale ja jestem leserem... :P tzn. teraz już pracuję, a nie się uczę ale przez to, że nie uczyłem się wtedy kiedy był na to czas to muszę się czasem wspomagać... -_-' bo trudno strasznie takie "kruczki" znaleźć.
The order of evaluation of the function designator, the actual arguments, and subexpressions within the actual arguments is unspecified, but *there is a sequence point before the actual call*.
Tak samo to wygląda w C++.
W twoim przypadku masz jedynie gwarancję, że pierwsza() wywoła się przed druga() oraz że czwarta() wywoła się ostatnia – zaznaczyłem to kursywą we wcześniejszym cytacie.
@smsrampage: Najprościej ująć to tak: kolejność ewaluacji parametrów funkcji jest nieokreślona, ale przed samym wywołaniem funkcji jej wszystkie parametry muszą być zewaluowane. :)
@smsrampage: Przy poprawnie napisanym kodzie nie powinno mieć znaczenia, w jakiej kolejności wykonają się funkcje zwracające argumenty do kolejnej funkcji. Zastanów się nad refaktoryzacją kodu.
A jeśli funkcja, która musi wykonać się pierwsza, ma jakiś ważny fragment, to zastanów się nad wydzieleniem go do osobnej funkcji i wykonanie jej wcześniej (np. funkcja druga i pierwsza wymagają wyciągnięcia danych z bazy, przy czym tylko funkcja druga łączy się z nią, wtedy logiczne
Czy gdy wywołuję funkcje w ten sposób:
mam pewność, że kolejność funkcji zostanie zachowana czy lepiej:
T b = druga(a);
T c = trzecia();
czwarta(a, b, c);
A może to działa odwrotnie, tj. od prawej do lewej?
Tak samo to wygląda w C++.
W twoim przypadku masz jedynie gwarancję, że pierwsza() wywoła się przed druga() oraz że czwarta() wywoła się ostatnia – zaznaczyłem to kursywą we wcześniejszym cytacie.
A jeśli funkcja, która musi wykonać się pierwsza, ma jakiś ważny fragment, to zastanów się nad wydzieleniem go do osobnej funkcji i wykonanie jej wcześniej (np. funkcja druga i pierwsza wymagają wyciągnięcia danych z bazy, przy czym tylko funkcja druga łączy się z nią, wtedy logiczne