какой порядок оценки функции в printf - PullRequest
0 голосов
/ 20 октября 2019

Вывод не совсем то, что я хочу.

Но если я установлю другой массив, он будет работать.

int n1,n2;
char str[9];
n1 = s_b(argv[1]);
n2 = s_b(argv[2]);

printf("    %s       %s\n",argv[1],argv[2]);
printf("~ : %s       %s \n",b_s(str,~n1),b_s(str,~n2));


int s_b(char *p)
{
    int n = 0;
    int index = 0;
    while(p[index] != '\0')
    {
        n <<= 1;
        n |= (p[index++] - '0');
    }

    return n;
}

char *b_s(char *p,int n)
{
    int ind;
    for(ind = 7; ind >= 0 ;ind--)
        {
            p[ind] = (n & 1) + '0';
            n >>= 1;
        }
    p[8] = '\0';

    return p;
}

s_b (char *) означает двоичную строку

b_s (char *, int) означает двоичное в строку, хранящееся в char *

, например,

вход:

   FILENAME 11101110 00010001

вывод:

   11101110       00010001

   00010001       00010001

но я ожидал:

вывод:

   11101110       00010001

   00010001       11101110

1 Ответ

3 голосов
/ 20 октября 2019

В ответе на вопрос в вашем заголовке порядок вычислений аргументов функции (для 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 перезаписывает строку, созданную первым вызовом, так что одна и та же строка печатается дважды.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...