2013-09-24 147 views
-4

由于在C下面的程序,%%在printf中做了什么?

#include <stdio.h> 

int main() 
{ 
    printf(" \"Books %% OR %% apparels\""); 
    getchar(); 
    return 0; 
} 

该程序打印书籍%或%服装, 我想知道%%的意义,因为它看起来是不必要的。

+0

编译器无关与此有关。阅读'man printf'。 – bmargulies

+0

尝试'man printf' –

+4

这是一个转义序列。由于%在printf类型函数中具有特殊意义,为了打印文字%,您键入%%以防止它被解释为开始转换fmt。 – gnometorule

回答

2

%指示用于格式化传递给printf()的变量的格式转义序列。

所以你必须逃避它打印%字符。

http://en.cppreference.com/w/c/io/fprintf


如果更换%%%,这样

#include <stdio.h> 
int main (int argc, char *argv[]) { 
    printf(" \"Books % OR % apparels\""); 
    return 0; 
} 

有两种转义序列printf()

  1. "% O"

    [guesswork]这不会产生一个有效的转义序列,因此printf()忽视它并按原样打印它。

  2. "% a"

    printf()将努力让从参数列表float并打印为“十六进制浮点,小写字母”(%a,见上面的网页)。由于C调用惯例(免责声明:我不是这方面的专家),因此会使用内存中的一些垃圾并解释结果。

其实我的编译器(gcc 4.4.3)发出警告两个:

$ gcc a.c 
a.c: In function ‘main’: 
a.c:3: warning: unknown conversion type character ‘O’ in format 
a.c:3: warning: too few arguments for format 
+0

我查过了,谢谢。 但是,我对此感到困惑: 如果我们用“%”替换“%%” 输出结果为“Books%or -0x1.a9288p-8pparels” 为什么这种行为? –