\%和%%之间的差异

时间:2013-12-14 13:20:54

标签: c printf

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

那么,有什么不同吗?

编辑代码请求:

#include <stdio.h>

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

输出:

%                                                                               
%  

使用-o

与GCC编译

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

3 个答案:

答案 0 :(得分:4)

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

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

警告是不言自明的,因为C中没有escape sequence \%

6.4.4.4字符常量;

  

双引号"和问号?既可以单独表示,也可以分别由转义序列\"\?表示,但单引号'和反斜杠\分别由转义序列\'\\表示。

很明显,%无法表示为\%。 C中没有\%

答案 1 :(得分:3)

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

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

答案 2 :(得分:0)

"%%"传递给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;
    }

输出: %