在阅读了一些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]
答案 0 :(得分:4)
两者都不一样。第二个将打印%
但如果是第一个,您将收到编译器警告。
[Warning] unknown escape sequence: '\%' [enabled by default]
警告是不言自明的,因为C中没有escape sequence \%
。
说
双引号
"
和问号?
既可以单独表示,也可以分别由转义序列\"
和\?
表示,但单引号'
和反斜杠\
分别由转义序列\'
和\\
表示。
很明显,%
无法表示为\%
。 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;
}
输出:
%