我发现以下代码可以在不使用+
运算符的情况下添加两个数字。
添加 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,完成了问题。
内部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.