c - C中printf的神秘返回值

  显示原文与译文双语对照的内容

引用给定在这里的答案,在下面的代码中,必须得到什么输出:


#include<stdio.h>



int main()


{


 int a=65;


 printf("%dn",printf("%d


 n",a));


 return 0;


}



它给出了输出:

 
65


4



而不是:

 
65


3



为什么?

时间:

正在打印4个字符<tab>n65,所以你得到的结果是。

注意,位于此printf("%dn",printf("%d行的末尾,将包含格式化字符串中下一行的所有缩进,运行文件时,此缩进原来是一个<tab>字符。有些人报告Ƥ�G��m쌧的输出是因为S@ackOverflow将粘贴代码中的所有制表符更改为4个空格,因此他们从你的问题中复制的代码与你在计算机上运行的代码不同,

查看此演示(联机版本) :


#include<stdio.h>



int main()


{


 int a=65;


 printf("%dn",printf("%d


 <--tab heren",a));


 return 0;


}



输出:


65 <--tab here


15



如果删除怪异的,完全不需要的,并且明显容易出错的行继续,它打印预期的输出:


#include<stdio.h>



int main()


{


 int a=65;


 printf("%dn",printf("%dn",a));


 return 0;


}



输出:

 
65


3



因为它将下一行的缩进字符(制表符,空格)作为字符串的一部分,要连接不同行上的字符串,只需将每个部分括在双引号中:


#include<stdio.h>


int main()


{


 int a=65;


 printf("%dn",printf("%d"


"n",a));


 return 0;


}



一般来说,for-line continuation只在多行宏定义或我不知道的一些特殊情况下有用。

检查起来很简单


void printbuff(const char *str, size_t len)


{


 while(len--)


 {


 printf("%03d = '%c'n", *str, *str >= ' ' && *str < 127 ? *str : ' ');


 *str++;


 }


}



int foo()


{


 char buff[32];


 int a=65;


 size_t len;


 printf("%dn", len = sprintf(buff,"%d


 n",a));


 printbuff(buff, len);


 return 0;


}



int bar()


{


 char buff[32];


 int a=65;


 size_t len;


 printf("%dn",len = sprintf(buff,"%dn",a));


 printbuff(buff, len);


 return 0;


}



int main()


{


 foo();


 bar();


}



自己检查,你会知道

它只是行首和'n'之间的字符(或字符),因为它仍然是相同的字符串,有什么取决于编辑。

Godbolt添加4个空格例如

https://godbolt.org/z/boPYNs

...