不使用运算符添加两个数字

时间:2012-09-08 13:54:21

标签: c

我发现以下代码用于添加两个数字而不使用+运算符。

添加3和4的代码:

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

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

3 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:5)

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

答案 2 :(得分: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.