6

在网上:printf用于添加两个数字(不使用任何运算符),如下所示:

main()
{
    printf("Summ = %d",add(10,20))
    return 0;
}

int add(int x,int y)
{   
    return printf("%*d%*d",x,' ',y,' ');
}

谁能解释一下,这是如何工作的:

return printf("%*d%*d",x,' ',y,' ');

注意:当我调用“sum”时,这会失败,如下所示:

sum(1,1) or sum(3,-1) 
4

3 回答 3

8

这里有两个中心概念:

  1. printf()返回打印的字符数。
  2. %*d格式说明符导致从其printf()参数中读取两个整数,并使用第一个设置用于格式化第二个(作为十进制数)的字段宽度。

因此,实际上添加的值用作字段宽度,printf()然后返回总和。

目前我不确定d空格字符的实际格式。这看起来很奇怪,我会用一个空字符串代替:

static int sum(unsigned int a, unsigned int b)
{
    return printf("%*s%*s", a, "", b, "");
}

int main(void)
{
    unsigned int a = 13, b = 6;
    int apb = sum(a, b);

    printf("%d + %d = %d?\n", a, b, apb);

    return 0;
}

以上工作并正确计算总和为19

于 2013-08-26T13:17:27.077 回答
2

printf返回打印的字符数。

在这里,它在add函数中使用格式字符串生成仅由10+20空格组成的字符串。

所以printfinadd函数会返回30.

然后,这个结果简单地用 printf 打印出来(他的主要目的)。

注意:这可能很明显,但printf必须避免这种用法。它非常脏,因为它会产生无用的输出。想象:add(10000,10000)...

于 2013-08-26T13:19:53.097 回答
1

首先,printf返回它打印的字符数。

其次,在格式说明符中%*d*表示要打印的最小字符数,但宽度不是来自格式字符串本身,而是来自附加参数。

总之,这项工作已经完成,但它不能很好地处理小数字,1因为%d在格式说明符中,更好的解决方案可能是:

("%*c%*c", a, ' ', b,' ');
于 2013-08-26T13:16:41.820 回答