gpt4 book ai didi

c - printf 中函数求值的顺序是什么

转载 作者:行者123 更新时间:2023-11-30 18:33:17 24 4
gpt4 key购买 nike

输出并不完全是我想要的。

但是如果我设置另一个数组它就可以工作。

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

最佳答案

在回答标题中的问题时,函数参数的求值顺序(对于 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 会覆盖第一次调用创建的字符串,从而使同一字符串打印两次。

关于c - printf 中函数求值的顺序是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58472310/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com