参考给出的答案here,必须从以下代码中得到什么输出:
#include<stdio.h>
int main()
{
int a=65;
printf("%d\n",printf("%d\
\n",a));
return 0;
}
它给出输出:
65
4
但是在我看来,它应该给这个:
65
3
为什么输出65 4
?
答案 0 :(得分:9)
您要打印4个字符<tab>
,\n
,6
和5
,因此您得到的结果很有意义。
请注意,此\
行结尾处的printf("%d\n",printf("%d\
将格式化格式字符串中下一行的所有缩进。运行文件时,该缩进最初是<tab>
字符。
有人报告65 7
的输出是因为StackOverflow将粘贴代码中的所有制表符更改为4个空格,因此他们从问题中复制的代码与您在计算机上运行的代码不同
请参见此演示,该演示显示了输出online version中<tab>
的存在:
#include<stdio.h>
int main()
{
int a=65;
printf("%d\n",printf("%d\
<--tab here\n",a));
return 0;
}
输出:
65 <--tab here 15
如果您删除了奇怪的,完全不必要的并且显然容易出错的行继续,它将很好地打印预期的输出:
#include<stdio.h>
int main()
{
int a=65;
printf("%d\n",printf("%d\n",a));
return 0;
}
输出:
65 3
答案 1 :(得分:6)
由于\
会将下一行的缩进字符(制表符,空格)作为字符串的一部分。要在不同行上连接字符串,只需将每个部分用双引号引起来:
#include<stdio.h>
int main()
{
int a=65;
printf("%d\n",printf("%d"
"\n",a));
return 0;
}
作为一般说明-行\
仅在多行宏定义或某些我不知道的特殊情况下有用。
答案 2 :(得分:-1)
检查非常简单
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("%d\n", len = sprintf(buff, "%d\
\n",a));
printbuff(buff, len);
return 0;
}
int bar()
{
char buff[32];
int a=65;
size_t len;
printf("%d\n",len = sprintf(buff, "%d\n",a));
printbuff(buff, len);
return 0;
}
int main()
{
foo();
bar();
}
检查一下自己,您就会知道
它只是行首和'\n'
之间的一个或多个char,因为它仍然是相同的字符串。那里有什么取决于编辑器。
Godbolt例如添加4个空格