Приращение префикса в препроцессоре C ++ - PullRequest
1 голос
/ 30 мая 2011

Может кто-нибудь объяснить, почему b = 150?

#define CUBE(X) ((X) * (X) * (X))

using namespace std;

int main( void )
{
    int a = 3,b = 0;  

    cout << "before "<< endl;
    cout << "a = " << a;
    cout << endl;
    cout << "b = " << b;
    cout << endl;
    cout << "after"<< endl;
    b = CUBE( ++a );
    cout << "a = " << a;
    cout << endl;
    cout << "b = " << b;
    getchar();
    return 0;
}

Ответы [ 3 ]

10 голосов
/ 30 мая 2011

Потому что вы используете макрос.Макросы не являются функциями.

Строка:

b = CUBE( ++a );

переписывается как:

b = ((++a) * (++a) * (++a))

до компиляции кода.

Затем код вызывает неопределенное поведение , потому что вы увеличиваете a между точками последовательности несколько раз.

Было бы лучше, если бы вместо этого вы использовали функцию.

3 голосов
/ 30 мая 2011

Неопределенное поведение - вы изменяете a более одного раза между точками последовательности.Вот почему функции inline являются значительно лучшим вариантом.

3 голосов
/ 30 мая 2011
...