Почему оба выхода разные? [Дубликат]
На этот вопрос уже есть ответ:
Почему эти конструкции используют неопределенное поведение до и после приращения? 14 ответов Каковы выражения с побочными эффектами и почему они не должны передаваться макросу? 3 ответаЯ использовал следующий C-код, и он выдал вывод как обычно:
9, 25
#include<stdio.h>
int PRODUCT(int x)
{
return (x*x);
}
void main()
{
int i = 3, j, k;
j = PRODUCT(i++);
k = PRODUCT(++i);
printf("%d, %d\n", j,k);
}
Однако когда я использовал определение макроса вместо функции следующим образом:
#include<stdio.h>
#define PRODUCT(x) (x*x)
void main()
{
int i = 3, j, k;
j = PRODUCT(i++);
k = PRODUCT(++i);
printf("%d, %d\n", j,k);
}
выход был
9, 49
Я пытался просмотреть код компиляции, используяcpp filename.c
и расширение main было примерно таким:
void main()
{
int i = 3, j, k;
j = (i++*i++);
k = (++i*++i);
printf("%d, %d\n", j,k);
}
Я не понимаю, почему операция приращения выполняется дважды при использовании макросов. Я изучаю C самостоятельно, и я не мог понять причину, почему. Заранее благодарю за любую помощь