【问题标题】:How does calling printf() add numbers here?调用 printf() 如何在这里添加数字?
【发布时间】:2014-02-25 07:33:38
【问题描述】:

我不明白这个printf() 电话是如何将两个数字相加的。 %*c 跟这个有关系吗?

//function that returns the value of adding two number
int add(int x, int y)
{
    NSLog(@"%*c",x, '\r');
    NSLog(@"%*c",y, '\r');
    return printf("%*c%*c",  x, '\r',  y, '\r'); // need to know detail view how its working
}

用于通话

printf("Sum = %d", add(3, 4));

输出

Sum=7

【问题讨论】:

标签: c printf format-specifiers


【解决方案1】:

当传递给printf(或类似函数)时,%*c 表示您传递的是两个参数而不是一个。第一个参数指定字段宽度,第二个参数指定在该字段宽度中写入的字符(或字符串、int 等)。

printf 返回写入输出流的字符总数。

【讨论】:

    【解决方案2】:

    % 后面的数字指定字段宽度;所以%5c 将打印 4 个空格,然后是字符参数,总共 5 个字符。

    * 指定字段宽度作为printf 的参数提供。所以这将打印一个x 字符字段,然后是另一个y 字符字段。每个字段都由空格和回车符 ('\r') 组成,因此不应有任何可见的输出。 printf 返回打印的字符总数 - 在本例中为 x+y

    【讨论】:

      【解决方案3】:

      我同意leeduhem,它非常聪明,

      printf() 返回它打印的字符数。 对于论点,我觉得举个例子比较容易理解:(也可以在here看到宽度技巧:

      #include <iostream>
      #include<cstdio>
      #include<cstdlib>
      using namespace std;
      
      int main() {
          // your code goes here
          int x = printf("%*c", 100, '\r');
          printf("%d\n", x);
          return 0;
      }
      

      x 是您设置为特定宽度的任何值(例如,它是 100)

      这意味着您指定的宽度实际上由printf() 计算并返回

      但是我觉得这个add()只能和正数决斗,如果其中一个数add(-3,-4),在我自己的机器上它仍然打印7 ...

      【讨论】:

      • 注意:“负精度参数被视为好像省略了精度”。
      【解决方案4】:

      哦,这很聪明。

      return printf("%*c%*c",  x, '\r',  y, '\r');
      

      成功时,printf() 将返回它打印了多少个字符,"%*c", x, '\r' 告诉它打印x 个字符(x-1 空格后跟一个\r)。所以printf("%*c%*c", x, '\r', y, '\r')会返回打印了多少个字符,也就是x+y

      更多详情请参阅printf(3)


      注意:

      正如@shole 所指出的,这个int add(int x, int y)仅适用于xy 都是非负整数。例如:

      add(-1, 1) // gives 2 instead of 0
      add(0, 1)  // gives 2 instead of 1
      

      【讨论】:

      • 我不认为'\r'被打印,它只是回车乞求行,空格打印x + y次
      • @Dabo 在"%*c", x, '\r'中,\r%*c中的'c'消耗的字符,显然也是printf()要打印的字符。 \r 本身就是一个空格字符。
      • 但是它没有打印x次,它只打印一次,前面有x-1个空格。
      • 感谢 leeduhem 的解释,我赞成全部解释,并接受你的快速回复和准确答案
      猜你喜欢
      • 1970-01-01
      • 2020-02-15
      • 2019-12-10
      • 2022-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-08
      • 1970-01-01
      相关资源
      最近更新 更多