#include<stdio.h>
int main(void)
{
int a=5;
printf("%d"+1,a);
}
输出:d。 我不明白输出为什么是 d?
#include<stdio.h>
int main(void)
{
int a=5;
printf("%d"+1,a);
}
printf
的第一个参数设为 "%d"+1
,实际上 "%d"
被视为指向存储有 %d
的内存位置的 const char *
。与任何指针一样,如果您将其增加1,则结果将指向以下元素,在这种情况下,将是 d
。
a
没有被使用,但这不应该是一个问题,因为通常(我不知道是否标准化 编辑:是的,可以看底部),可变参数函数的栈清理责任由调用者承担(至少cdecl 使用此方式),但这可能是UB,我不确定*)。
您可以通过以下方式更轻松地查看:
#include<stdio.h>
int main(void)
{
int a=5;
const char * str="%d";
printf(str + 1, a);
}
str ---------+
|
V
+----+----+----+
| % | d | \0 |
+----+----+----+
str + 1 ----------+
|
V
+----+----+----+
| % | d | \0 |
+----+----+----+
因此,("%d"+1
) (即 "d"
)被解释为格式化字符串,printf
没有找到任何 %
,会直接将其打印出来。如果你想要打印 a
加 1 的值,应该这样做:
printf("%d", a+1);
fprintf
中拥有未使用的参数是可以的:
如果格式已用尽而仍有参数剩余,则评估过多的参数(始终如此),但是其它方面会被忽略。
printf
也定义为具有相同的行为,位于§7.19.6.3.2中
printf函数等效于在参数之前插入stdout参数的fprintf函数。
字符串字面量是指针。将指向"%d"
的指针向前移动1个位置会得到"d"
。参数被丢弃。
你应该使用printf("%d", a+1)
。 "%d" + 1
是一个指向{'%','d','\0'}
字符数组中的"d"
的指针。
char x[] = "%d";
你期望什么
printf(x + 1, a);
打印?
提示:t.c:5: 警告:格式的参数过多。
因为+1
。如果你想要增加a
,请使用:printf("%d", a + 1);
。