输出原因

时间:2010-10-07 09:41:16

标签: c

#include<stdio.h>
int main(void)
{
 int a=5;
 printf("%d"+1,a);
}

输出:d。 我没有得到输出的结果:d?

6 个答案:

答案 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”