为什么`\`会影响printf的返回值?

bet*_*eta 4 c printf

参考此处给出的答案,您必须从以下代码中得到什么输出:

#include<stdio.h>

int main()
{
    int a=65;
    printf("%d\n",printf("%d\
    \n",a));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

它给出了输出:

65
4
Run Code Online (Sandbox Code Playgroud)

但对我来说,它似乎应该给出这个:

65
3
Run Code Online (Sandbox Code Playgroud)

为什么是输出65 4

ruo*_*ola 9

您正在打印 4 个字符<tab>, \n, 6, 和5,因此您得到的结果完全合理。

请注意,\在此printf("%d\n",printf("%d\行的末尾,将包含下一行的所有缩进到格式化字符串中。<tab>当您运行文件时,此缩进最初是一个字符。

有些人报告输出的原因 65 7是 StackOverflow 将粘贴代码中的所有选项卡更改为 4 个空格,因此他们从您的问题中复制的代码与您在机器上运行的代码不同。

请参阅此演示,其中显示<tab>了输出中的存在(在线版本):

#include<stdio.h>

int main()
{
    int a=65;
    printf("%d\n",printf("%d\
    <--tab here\n",a));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

#include<stdio.h>

int main()
{
    int a=65;
    printf("%d\n",printf("%d\
    <--tab here\n",a));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果你删除奇怪的、完全不必要的、明显容易出错的行继续,它会很好地打印预期的输出:

#include<stdio.h>

int main()
{
    int a=65;
    printf("%d\n",printf("%d\n",a));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

65 <--tab here
15
Run Code Online (Sandbox Code Playgroud)


Eug*_*Sh. 6

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

#include<stdio.h>
int main()
{
    int a=65;
    printf("%d\n",printf("%d"
    "\n",a));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

作为一般说明 - \for 行延续仅在多行宏定义或我不知道的一些特殊情况下很有用。