napotkałem się na makra w C++ i proszę o wyjaśnienie otrzymanych wyników:
Makro nie wykonuje kodu od tego jest funkcja. To co w nawiasie idzie w miejsce jako r, czyli:
ad3 tutaj masz POST inkrementacje - w tej linii i jest dalej 2
ALE (patrz 2linia postu), wywołujesz i++ 2x, bo 2x masz r we wzorze, więc i=4
ad4 tutaj jest pre inkrementacje więc i jest o 1 większe (musisz doliczyć do co dodałeś wyżej więc i=6), ale liczysz kolejno więc w połowie i=5
i=4 = AREA(i+1) - 3,14*++4*++5 więc masz - 3,14*5*6
Powiesz, “ale ja mam w cout co innego”, no masz, bo cout najpierw liczy to co ma wyświetlić, a potem wrzuca wynik (masz następną instrukcję więc widzisz już wynik obliczeń, czyli zmieniłeś i nim je zdążyłeś wyświetlić)
zatem najpierw wykonują się obliczenia na podstawie i, a potem dopiero wyświetlona zostanie wartość i już po inkrementacji;
dzięki za wyjaśnienie
Reguły rozwijania makr są trochę bardziej skomplikowane niż opisujesz (ale ta, w podstawowych scenariuszach jest mniej więcej tak, jak piszesz; trzeba pamiętać, że preprocesor najzwyczajniej w świecie robi coś na kształt string-replace). Ale ważniejsze jest to, że używasz parametrów makra bez nawiasów. To zawsze powoduje problemy.
Dzięki Ryan i drobok