Действительно ли C-faq говорит это? Вы дважды модифицируете переменную (i
) с помощью промежуточной точки последовательности, которая просто дает неопределенное поведение, ничего более или менее. Он может напечатать 49 или 56, или 73295, или вообще ничего, или «Форматирование жесткого диска ...» (и приступить именно к этому).
Редактировать: То, что может произойти, сводится к следующему: с постинкрементом часть приращения может происходить где угодно между моментом получения значения и следующей точкой последовательности. Сгенерированный код может легко действовать так:
int temp = i;
++i;
int temp2 = i;
++i;
printf("%d\n", temp * temp2);
С другой стороны, он также может действовать так:
int temp = i;
int temp2 = i;
++i;
++i;
printf("%d\n", temp * temp2);
В то время как один из этих двух вероятен, стандарт не предписывает ни того, ни другого. Как я уже говорил выше, это неопределенное поведение, что означает, что стандарт C не накладывает каких-либо ограничений на то, что может делать код.