Приращение префикса означает, что приращение выполняется перед оставшимися операциями. Насколько мне известно, официальное требование состоит в том, что оценка счетчика ++ не является исходным значением.
Вероятно, он расширяется как шаг перед оператором, например так:
counter = counter + 1;
counter = counter + 1;
printf("foo(%d) -- %d\n", counter, ((counter)*(counter)));
Что бы создать поведение, которое вы видите. Моя рекомендация состоит в том, чтобы избежать чрезмерного стресс-тестирования подобных угловых случаев.