\%和%%之间的差异
在阅读了一些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; }
产量: %