Почему оба выхода разные? [Дубликат]

На этот вопрос уже есть ответ:

Почему эти конструкции используют неопределенное поведение до и после приращения? 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 самостоятельно, и я не мог понять причину, почему. Заранее благодарю за любую помощь

Ответы на вопрос(6)

Ваш ответ на вопрос