我发现下面的代码中没有使用+
运算符来添加两个数字。在不使用运算符的情况下添加两个数字
代码来添加3和4:
printf("%d",printf("%*c%*c",3,' ',4,' '));
现在printf()
返回的字符数在结果 和%*c
忽略下一个字符它遇到。但是,我仍然无法理解这段代码。任何帮助,将不胜感激。
我发现下面的代码中没有使用+
运算符来添加两个数字。在不使用运算符的情况下添加两个数字
代码来添加3和4:
printf("%d",printf("%*c%*c",3,' ',4,' '));
现在printf()
返回的字符数在结果 和%*c
忽略下一个字符它遇到。但是,我仍然无法理解这段代码。任何帮助,将不胜感激。
printf("%*c", n, c)
打印字符c
,n
次。所以代码会打印3个空格,然后是4个空格,而printf
会返回打印的字符数,显然是3 + 4,从而完成此问题。
实际上,它在字符宽度为'n'上打印字符'c',用空格填充。 (如你的答案所示,不用填充'c'副本) –
内部printf
输出3,然后4个空格并返回字符数7,并且外部printf
正在打印该结果。
我在添加这个答案来指定标准的规则。
这里是利用返回值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参数用于提供 字段宽度或精度
的
fprintf
函数返回的字符数发送,或 负值如果发生输出或编码错误。
要清除你的想法这个例子就可以了(我用%d
在这里,让你得到该领域的想法)。
如果x = 10
和y=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.
但此类代码也有一些显著的副作用。 –
只有副作用我知道它根据输入的空格数量来移动输出。还要别的吗 ? – Peps0791
但是这种副作用是主要的。你不能简单地说出这是一种奇怪的方式来添加。 –