根据我的说法
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并从那里打印字符串......
现在在下列情况下会发生什么?这似乎超出了我的范围。
printf("%",a);
printf("%%%%");
printf("%%d",a);
答案 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("%%%%");
将输出
%%