#include<stdio.h>
int main(void)
{
int a=5;
printf("%d"+1,a);
}
输出:d。 我没有得到输出的结果:d?
答案 0 :(得分:24)
您作为printf
"%d"+1
的第一个参数传递; "%d"
实际上被视为const char *
,指向存储%d
的内存位置。与任何指针一样,如果将其递增1,结果将指向以下元素,在本例中,该元素将为d
。
a
未被使用,但这不应成为问题,因为一般情况下(我不知道它是否是标准强制的 编辑:是它是,见底部)变量函数的堆栈清理责任取决于调用者(至少,cdecl
是这样做的,但这可能是也可能不是UB,我不知道< / S> *)。
你可以通过这种方式看到它:
#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);
<小时/> 修改: *好吧,它不是UB,至少对于C99标准(§7.19.6.1.2),可以在
fprintf
中使用未使用的参数:
如果参数保留时格式已用尽,则多余的参数为 评估(一如既往),否则将被忽略。
和printf
被定义为在§7.19.6.3.2
printf函数等效于插入参数stdout的fprintf 在printf的参数之前。
答案 1 :(得分:12)
字符串文字是指针。将指针"%d"
推进1会产生"d"
。这个论点被抛弃了。
答案 2 :(得分:2)
你应该printf("%d", a+1)
。 "%d" + 1
是指向"d"
(char
)数组中{'%','d','\0'}
的指针。
答案 3 :(得分:1)
由于+1
。如果您想增加a
,请执行:printf("%d", a + 1);
。
答案 4 :(得分:1)
假设你有:
char x[] = "%d";
你期待什么
printf(x + 1, a);
打印?
提示:t.c:5:警告:格式
的参数太多答案 5 :(得分:0)
“%d”是String常量,它将存储在内存中的char []中。在运行时,“%d”返回char []的起始位置。将字符数组指针增加一,将指向下一个字符。因此,“d”单独传递给printf函数。所以输出是“d”