Порядок оценки не определен в Официальной спецификации С.
Однако с практической точки зрения параметры обычно оцениваются справа налево.
В вашей задаче оператор сдвига бит не меняет значение X, поэтому порядок вычисления не важен. Вы получите 5,20,1, независимо от того, будут ли они оценены слева направо, справа налево или посередине.
В C параметры помещаются в стек в порядке справа налево, так что 1-й параметр (в этом случае, char * "% d,% d,% d ") находится на вершине стека. Параметры обычно (но не всегда) оцениваются в том же порядке, в котором они передаются.
Проблема, которая лучше иллюстрирует то, о чем вы говорите:
int i=1;
printf("%d, %d, %d", i++, i++, i++);
Официальный ответ - "undefined".
Практический ответ (в нескольких компиляторах / платформах, которые я пробовал) - «3, 2, 1».