2014-09-26 46 views
-4

的怪异输出据我了解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);

回答

4

printf("%",a);不具有有效的转换说明,所以它是由覆盖:

§7.21.6.1

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

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

A '%' 被写入。没有参数被转换。完整转换 规范是'%%'。

正如在评论中提到的,printf("%%d",a);可能不是未定义的行为。 %%变为%,并且a被忽略。

§7.21.6.1

2所述的函数fprintf写入输出到流指向流, 下字符串的控制由格式指定 后续参数如何被转换为输出指向。如果格式的 参数不足,则行为未定义。如果 格式在参数保留时用尽,则会对超出的参数 进行评估(如往常一样),但会被忽略。当遇到格式字符串的结尾时,函数返回fprintf 函数。

+0

wHat i feel for printf(“%%%%”); 编译器注意到第一个%超过了它......然后它注意到第二个%而不是格式说明符,所以它打印了它......现在它进入第三个%,并在它过去之后注意是否存在任何格式说明符,但它没有注意到它.....所以4%被打印....我是谁? – user3126632 2014-09-27 05:32:27

0

我希望从C标准这句话会帮你

8转换说明符及其含义如下:

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

例如

printf("%%%%"); 

将输出

%%