Это не имеет ничего общего с Printf, и все, что связано с порядком, в котором оцениваются параметры и пути компилятор выполняет код. Поведение не определено, и результаты будут зависеть от вашего компилятора, вызывающего соглашения и фазы луны.
В обоих примерах приоритеты имеют правила предварительного и последующего приращения. Ваш конкретный компилятор понимает, что перед оценкой приращения он должен использовать значение i
и дает приоритет параметру, который вызывает вызов функции над тем, который этого не делает. Ваше второе использование переменной i
вызывает компилятор для вставки посреднического заявления в процессе вызова printf
,
Важно отметить, что i++
не означает (как это обычно преподается) «приращение I после выполнения этой строки », это просто означает« приращение i в какой-то момент после предоставления мне его значения и перед выполнением следующей строки ». Это очень много возможностей для компилятора, чтобы сделать то, что официально называется «неопределенным поведением».
Как отмечает @Als в комментарии, вам удалось объединить как неопределенные, так и неуказанные поведения в одной строке кода.
Использование я ++ и я в одном операторе не определено поведение. Он может печатать что угодно. См. Http://stackoverflow.com/q/4401104/79455 – rve
Вы имеете в виду, как i ++ работает в случаях. – RvdK
@rve: Использование 'i ++' и 'i' в одном выражении * может * быть в порядке; проблема заключается в том, когда они оцениваются без промежуточной точки последовательности. –