Я заметил это странное поведение макрофункций при использовании оператора 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.
Было бы очень полезно, если кто-нибудь сможет объяснить, почему выходы такие?
неопределенное поведение – Danh
Это не совсем дубликат http://stackoverflow.com/questions/949433/why-are-these-constructs-using-undefined-behavior, поскольку OP может быть смущен тем, что делают макросы (как предполагалось Ответ Сурав Гоша). –
эй @ Danh на самом деле этот вопрос задавали на одном из моих экзаменов, поэтому я думал, что должно быть что-то, чтобы получить ответ. – user7297996