makrodefinicja funkcji, dziwna kolejność wykonywania

0

Witam. Mam taki raczej abstrakcyjny kod, nie chodzi tu o znaczenie, tylko o kolejność wykonywania funkcji:

 #include <iostream>
#define D(x,y) (x * y) //(x < y ? x : y)
using namespace std;

int f(int &x)
{
    return x;
}

int g(int &x)
{
    return x;
}

int main(int argc, char *argv[]) 
{
    int x = 3; int y = 4;
    cout << D(g(x),g(y)) << f(x) << endl;
    system("pause");
    return 0;
}

Sprawdziłem w debugerze kolejność wykonywania i najpierw weszło mi do funkcji f(x), a potem g(x). Jeśli natomiast zmienię definicję D(x,y) na tą co jest w komentarzu "(x < y ? x : y)", to najpierw wykonuje się funkcja g(x), a potem f(x). Jest mi to ktoś w stanie wytłumaczyć? I nie mówcie, żebym nie używał w tym przypadku makrodefinicji #define, bo wcale nie chcę ich używać, tylko miałem zadanie z nimi związane na kolokwium, no i prawdopodobnie będę pisał poprawkę...

0

W zasadach kolejności wykonywania wyrażeń dla C++ nie ma niczego szczególnego dla: x * y oraz x < y. To znaczy, że wyrażenia x oraz y mogą być wykonywane (obliczane, zwał jak zwał) w dowolnej kolejności. Oczywiście dopiero po obliczeniu obu wykonywana jest reszta wyrażenia, czyli działanie operatora.

Innymi słowy: kolejność wykonywania podwyrażeń jakiegoś wyrażenia jest nieokreślona, chyba, że zostało to inaczej opisane w standardzie. Wyrażeń, których tutaj użyłeś nie dotyczą żadne specjalne reguły.

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