2016-12-14 2 views
0

Я заметил это странное поведение макрофункций при использовании оператора pre increment. Я знаю, что это не является предпочтительным, чтобы использовать предварительно оператор инкремента с макросами, но все же я хотел бы знать причину выполнения следующих 2 кодов:Макро и Pre/Post Increment в C

#include <stdio.h> 

#define SQR(x) {x*x } 

int main() 
{ 
    int a=4; 
    int b=SQR(a++); 
    int c=SQR(++a); 
    printf("%d.....%d....%d\n",b,c,a*b*c); 
    return 0; 
} 

Выход этого:

20.....64....10240 

Первое значение b равно 20, что соответствует 4 * 5. Но почему значение С составляет 64, т. Е. 8 * 8 вместо 7 * 8?

И я просто заменил последовательность выполнения так:

#include <stdio.h> 

#define SQR(x) {x*x } 

int main() 
{ 
    int a=4; 
    int c=SQR(++a); 
    int b=SQR(a++); 
    printf("%d.....%d....%d\n",b,c,a*b*c); 
    return 0; 
} 

Выход этого:

42.....36....12096 

Странно, не так ли? Предварительное увеличение снова имело некоторые проблемы. Это дало 42, то есть 6 * 7 вместо 5 * 6, и после этого приращение по почте также дало неверный ответ 36, то есть 6 * 6 вместо 6 * 7.

Было бы очень полезно, если кто-нибудь сможет объяснить, почему выходы такие?

+0

неопределенное поведение – Danh

+0

Это не совсем дубликат http://stackoverflow.com/questions/949433/why-are-these-constructs-using-undefined-behavior, поскольку OP может быть смущен тем, что делают макросы (как предполагалось Ответ Сурав Гоша). –

+0

эй @ Danh на самом деле этот вопрос задавали на одном из моих экзаменов, поэтому я думал, что должно быть что-то, чтобы получить ответ. – user7297996

ответ

2

Макросы текстуальное замены, так что ваш код

SQR(a++) 

расширяется к чему-то вроде

a++ * a++ 

и int c=SQR(++a); к int c = ++a*++a;

, который вызывает undefined behavior. Для разработки части для этой части, пожалуйста, обратитесь к этому хорошо написанному ответу.

+0

Нет ли способа получить ответ по крайней мере для первой функции, поскольку это то, что я попал на один из моих экзаменов – user7297996

+1

@ user7297996 nopes, UB ... UB. это оно. –

+0

Хорошо, спасибо за помощь ур. – user7297996