В ответе на вопрос в вашем заголовке порядок вычислений аргументов функции (для printf
и любой другой функции) равен неопределен . Это означает, что вы не можете зависеть от этого. Но оказывается, что это не ваша проблема здесь. (Или см. Больше по этому вопросу ниже.)
Реальная проблема заключается в том, что вы используете один массив str
для хранения результатов двух вызовов b_s
, поэтому второй вызов (какой бы ни одинэто так) перезаписывает первое. Таким образом, printf
заканчивается печатью двух копий одного и того же.
Вы можете исправить это одним из двух способов.
1. Используйте два массива:
char str1[9], str2[9];
printf("~ : %s %s \n", b_s(str1,~n1), b_s(str2,~n2));
(Возможно, вы уже нашли это решение.)
2. Измените его на
printf("~ : %s ", b_s(str, ~n1));
printf("%s \n", b_s(str, ~n2));
Теперь вы печатаете каждую строку каксоздал, перед вторым вызовом b_s()
перезаписывает его.
Добавление: Возможно, я неправильно понял ваш вопрос "Каков порядок оценки функции в printf?". Когда вы звоните printf("%d %d\n", a(), b())
, не определено, будет ли a()
вызываться первым или b()
вызываться первым. Но гарантируется, что и a()
, и b()
будут вызваны до вызова printf
. Точно так же в вашем звонке printf("%s %s\n", b_s(...), b_s(...))
, оба звонка на b_s()
происходят до того, как printf
будет вызван. Вот почему второй вызов b_s
перезаписывает строку, созданную первым вызовом, так что одна и та же строка печатается дважды.