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

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

添加3和4的代码:

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

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

printf("%*c", n, c)打印字符cn次。 因此代码打印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开始

可选的最小字段宽度。 如果转换后的值的字符数少于字段宽度,则在字段宽度上用左侧(或右侧,如果左侧调整标志,稍后描述)填充空格(默认情况下)字段宽度采用星号* (稍后描述)或非负十进制整数的forms。

并在同一节§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.