这是用于在不使用任何运算符的情况下查找两个数字之和的代码,这里为什么使用%c而不是%d?与%d相比,%c的特征是什么?
int add(int x, int y)
{
return printf("%*c%*c", x, ' ', y, ' ');
}
int main()
{
printf("Sum = %d", add(3, 4));
return 0;
}
答案 0 :(得分:1)
这里使用printf
的返回值。分别为x-1
个空格(' '
),然后再为空格(如您指定的)和y-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
函数返回传输的字符数 ,或者 如果发生输出或编码错误,则为负值。
%c
代替%d
?有人可能会争辩说,这是因为我们不打算打印这些数字或任何内容 - 只需要print
x
个数字和y
个数字,以便我们得到x+y
的rturn值。你可以尝试这个,这个也可以工作,但你会看到一些数字在屏幕上有如此大的字段witdh。试试这个
return printf("%*d%*d", x, x, y, y);
如果x = 10
和y=2
那么它将是
| | | | | | | | |1|0| |2|
1 2 3 4 5 6 7 8 9 10 \ \
11 12
That's how 12 characters are printed.
答案 1 :(得分:1)
请注意以下两点:
printf("%*c",x,' ')
指定打印x
' '
printf()
返回字符数。
所以
return printf("%*c%*c", x, ' ', y, ' ');
返回打印的总字符数 -
指定打印' '
的宽度x
+指定打印' '
的宽度y
,相当于返回x+y