Значение для x было 12, так что printf напечатал бы 12, а затем x должен был быть присвоен 2, и, хотя ++ был там, x должен быть позже изменен на 2 + 1, и в строке 6 выполняется предварительное увеличение, поэтому output не должен т быть 124.
нет, назначение выполнено после всего, что касается printf("%d", ++x);
, ваш код эквивалентен этому:
#include <stdio.h>
int main(){
int x = 12;
int y = printf("%d", x++);
x = y;
printf("%d", ++x);
return 0;
}
так x = printf("%d", ++x);
делает:
- printf пишет 12
- затем x увеличивается до значения 13
- затем x присваивается результату printf со значением 2
затем вы выполняете printf("%d", ++x);
, тогда как x значения 2 ранее, поэтому x увеличивается до того, как будет задано в аргументе, поэтому 3 записывается
и окончательный результат печати - 123
PS. Как сказал @ H.S. в другом замечании: после вычисления всех аргументов функции есть точка последовательности (x ++ является аргументом для printf ()) и операция до / после увеличения / уменьшения завершается в или до следующей точки последовательности.