2012-09-08 35 views
9

我发现下面的代码中没有使用+运算符来添加两个数字。在不使用运算符的情况下添加两个数字

代码来添加3和4:

printf("%d",printf("%*c%*c",3,' ',4,' ')); 

现在printf()返回的字符数在结果 和%*c忽略下一个字符它遇到。但是,我仍然无法理解这段代码。任何帮助,将不胜感激。

+0

但此类代码也有一些显著的副作用。 –

+0

只有副作用我知道它根据输入的空格数量来移动输出。还要别的吗 ? – Peps0791

+3

但是这种副作用是主要的。你不能简单地说出这是一种奇怪的方式来添加。 –

回答

9

printf("%*c", n, c)打印字符c,n次。所以代码会打印3个空格,然后是4个空格,而printf会返回打印的字符数,显然是3 + 4,从而完成此问题。

+2

实际上,它在字符宽度为'n'上打印字符'c',用空格填充。 (如你的答案所示,不用填充'c'副本) –

5

内部printf输出3,然后4个空格并返回字符数7,并且外部printf正在打印该结果。

1

我在添加这个答案来指定标准的规则。

这里是利用返回值printf。分别为3-1空格(' ')然后再次空格(如您指定)和4-1空格,然后再打印1个空格。然后返回写入的字符总数。这是总结如何完成的。

我只记得这条规则

printf("%*c",X,C) prints the char C in a field of size X 

所有这些行为在C11标准解释。

从标准 §7.21.6.1p4

可选最小字段宽度。 如果转换值具有比所述场宽度更少 字符,则将它用空格填充(默认) 在左侧(或右侧,如果左调整标志,后文所述, 已经给出)到字段宽度。 字段宽度的格式为 星号*(稍后介绍)或非负十进制整数。

并且以相同的节 §7.21.6.1p5

如上所述,场宽度,或精度,或两者,可以用星号来表示 。在这种情况下,一个int参数用于提供 字段宽度或精度

最后§7.21.6.1.p14

fprintf函数返回的字符数发送,或 负值如果发生输出或编码错误。


要清除你的想法这个例子就可以了(我用%d在这里,让你得到该领域的想法)。

如果x = 10y=2那么这将是

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

更清楚

| | | | | | | | |1|0| |2| 
1 2 3 4 5 6 7 8 9 10 \ \ 
         11 12 

That's how 12 characters are printed. 
相关问题