以下代码输出结果为“d”:
void main()
{
short int a=5;
printf("%d"+1,a);
getch();
}
< p > printf() 函数是如何工作的?< /p >
void main()
{
short int a=5;
printf("%d"+1,a);
getch();
}
< p > printf() 函数是如何工作的?< /p >
printf
没有“看到”格式说明符,因为您传递了指向 "%d"
加一的指针。这相当于仅传递 "d"
:
printf("d", a);
将会打印 d
并忽略 a
。这不仅仅适用于 printf
,指针算术运算对所有的 char
指针都是如此,包括从字符串字面量(即由双引号括起来的字符序列)获取的指针。
printf("%d"+1,a);
无法显示,因为只有一个格式说明符,而这个 ("%d"+1) 会生成错误。printf("%d+1",a);
或者 printf("%d",a+1);
。类似于 "%d" 的字符串字面量是 数组表达式,在大多数情况下,数组表达式会被转换为指针表达式,其值为数组的第一个元素的地址:
Item Address 00 01 02 03 ----- ------- -- -- -- -- "%d" 0xfffbec00 '%' 'd' 0 ??
例如,字符串字面量 "%d" 开始的地址是 0xfffbec00。通过写入 "%d"+1
,您将 1 添加到结果指针值(得到 0xfffbec01),因此您实际上传递了字符串字面量 "d" 给 printf
。
由于字符串 "d" 不包含格式说明符,printf
将字符串原样打印。参数 a
在传递给 printf
之前会被 求值,但否则会被忽略。