C 中 printf 的未定义行为?

Pol*_*uks -1 c stdio

单个百分号的输出应该是什么?

#include <stdio.h>

void main()
{
    printf("%");
}
Run Code Online (Sandbox Code Playgroud)

“未知格式代码”与“未知转义序列”不同。

dbu*_*ush 7

你正在做的是未定义的行为

\n

C 标准第 7.21.6.1p9 节有关格式说明符fprintf(以及扩展printf) 的规定:

\n
\n

如果转换规范无效,则行为未定义。如果任何参数不是相应转换规范的正确类型,则行为未定义。

\n
\n

-Wall另外,如果您这样做,gcc 将生成警告:

\n
warning: spurious trailing \xe2\x80\x98%\xe2\x80\x99 in format [-Wformat=]\n
Run Code Online (Sandbox Code Playgroud)\n

打印%字符的正确方法是使用格式说明符%%

\n
printf("%%");\n
Run Code Online (Sandbox Code Playgroud)\n

  • 可能值得注意的是,打开警告后,应该收到有关 `printf("%");` 的警告 (2认同)