在C语言中使用printf进行加法运算

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) 

不知道为什么每个输入都无法正常工作,例如“sum(1,1)”..我需要修改每个输入的代码吗?如果是这种情况,则该逻辑是错误的。 - bapi
我会选择char dummy; return snprintf(&dummy, 1, "%*s%*s", x, "", y, ""); 来避免无用的输出。 - nneonneo
你在上面的代码中定义了一个名为 add 的函数。那么你的问题是关于函数 sum 的。这两个函数是不同的。 - abelenky
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

@cHao 当然,我也会用s将其打印为字符串。看代码吧,我认为这样更清晰明了。 - unwind
是的,看到更新了。这样更有意义。 :) - cHao
1
好的,' '是一个int,所以%d格式化会输出32。由于字段宽度是最小的(意味着如果输出大于指定的宽度,则不会被截断),add(1,1)将返回4。你的解决方案使用%*s""因此更好(当然这个技巧无法处理负数)。 - Virgile
@Virgile,这也是我的观点,但感谢你明确表述。 :) 我将sum()的参数改为unsigned int,以明确它不能处理负数,你发现得很好。 - unwind
谢谢回复...当添加一个"+ve"和一个"-ve"数字时,它不起作用。 - bapi

2

printf函数返回打印字符的数量。

这里,它被用于add函数中,通过使用格式化字符串生成仅由10+20个空格组成的字符串。

因此,add函数中的printf将返回30

然后,这个结果仅仅是用printf打印出来(它的主要目的)。

注意:显而易见,应该避免使用这种printf用法。它非常糟糕,因为它会产生无用的输出。想象一下:add(10000,10000)...


1

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

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

将所有内容结合起来,工作完成了,但是对于像 1 这样的小数字,由于格式说明符中的 %d,它可能无法正常工作,更好的解决方案是:

("%*c%*c", a, ' ', b,' ');

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接