了解printf函数的奇怪输出

时间:2014-09-26 19:56:10

标签: c printf

根据我的说法

int a=0;
printf("%d",a);

相同
char *ptr="%d"

ptr指向%,然后ptr从%读取整个字符串,从内存中读取4个字节。

现在考虑以下代码

printf("%d"+1,a);  //value of a=0

相同
char *ptr="%d"
ptr+=1;

ptr现在指向d,因此打印出来自d的字符串

现在

printf(1+"Alex"); //prints lex

ptr指向l并从那里打印字符串......

现在在下列情况下会发生什么?这似乎超出了我的范围。

  1. printf("%",a);

  2. printf("%%%%");

  3. printf("%%d",a);

2 个答案:

答案 0 :(得分:4)

printf("%",a);没有有效的转换说明符,因此它包含在:

§7.21.6.1

  

9如果转换规范无效,则行为为   未定义。如果任何参数不是正确的类型   相应的转换规范,行为未定义。

printf("%%%%");只会打印%%,因为%%是转化说明符。请参阅printf man pages

  

     

写'%'。没有参数被转换。完全转换   规范是'%%'。

如评论中所述,printf("%%d",a);可能不是未定义的行为。 %%变为%a将被忽略。

§7.21.6.1

  

2 fprintf函数将输出写入stream指向的流,   在格式指向的字符串的控制下,指定如何   后续参数将转换为输出。如果有   格式的参数不足,行为未定义。如果   参数保留时,格式是耗尽的,多余的参数   被评估(一如既往)但被忽略。 fprintf   遇到格式字符串的结尾时,函数返回。

答案 1 :(得分:0)

我希望C标准的这句话能帮到你

  

8转换说明符及其含义为:

     

%写入%A字符。没有参数被转换。完整的   转换规范应为%%。

例如

printf("%%%%");

将输出

%%