\%和%%之间的差异

在阅读了一些K&R CI之后,看到printf可以“识别%%”,我测试了它并打印出“%”,然后我尝试了“\%”,它也打印了“%”。

那么,有什么区别吗?

编辑代码请求:

#include  int main() { printf("%%\n"); printf("\%\n"); return 0; } 

输出:

 % % 

使用-o使用GCC编译

GCC版本:gcc(SUSE Linux)4.8.1 20130909 [gcc-4_8-branch revision 202388]

%%不是C转义序列,而是一个printf格式化程序,就像它自己的特殊字符一样。

\%是非法的,因为它具有C转义序列的语法,但没有定义的含义。 除了标准列出的少数转义序列是特定于编译器的。 很可能编译器忽略了反斜杠,而printf在运行时没有看到任何反斜杠。 如果有,它会在输出中打印反斜杠,因为反斜杠对printf来说并不特殊。

两者都不一样。 第二个将打印%但如果是第一个,您将收到编译器警告。

 [Warning] unknown escape sequence: '\%' [enabled by default] 

警告是自解释的,没有像C中的\%那样的转义序列 。

6.4.4.4字符常数;

双引号"和问号?可以通过它们自己或转义序列来表示\"\? 分别是单引号'和反斜杠\应分别用转义序列\'\'来表示。

很明显, %不能表示为\% 。 C中没有\%

"%%"传递给printf时,它会将%打印到STDOUT但是"\%"不是C中的有效转义序列,因此程序将编译但不会打印任何内容并将生成警告warning: spurious trailing '%' in format [-Wformat=] printf("\%");

C语言中的转义序列列表可以在http://en.wikipedia.org/wiki/Escape_sequences_in_C找到

这不会打印第二个printf的%。

  int main() { printf("%%\n"); printf("\%"); printf("\n"); return 0; } 

产量: %