无法理解使用printf的程序输出

时间:2014-09-26 16:03:03

标签: c printf

当我找到这段代码时,我正在处理一些面试问题。

#include<stdio.h>
int main()
{
 short int a=5;

 printf("%d"+1,a);    //does not give compiler error 

 return 0;
}

它打印以下内容:

d

我无法理解printf函数在这里是如何工作的。

4 个答案:

答案 0 :(得分:16)

让我们看一下printf()电话的第一个参数。

"%d" + 1

这与ptr在以下代码中的含义相同。

char *ptr = "%d";
ptr = ptr + 1;

那么,增加指针是什么意思?好吧,我们向前推进指针sizeof(*ptr) * 1

所以,在记忆中我们有:

%d\0
^^
||
|This is where ("%d" + 1) points to.
This is where ("%d") points to.

因此,您的代码或多或少在功能上等同于:

short int a = 5;
printf("d", a);

将评估然后忽略额外的函数参数并打印d


还有一件事:您非常接近在该代码中导致未定义的行为。 printf("%d", a)使用了错误的格式字符串。 short int的正确格式字符串为"%hd"

您可以找到格式字符串here的完整表格。

答案 1 :(得分:7)

"%d" + 1执行指针算术,编译器将其视为"d",所以

printf("%d"+1,a); 

变为:

printf("d", a); 

您可以看到它在编译器中输出d的原因。

正如@sharth在评论中指出的那样,此处的额外参数a将被评估并丢弃。

答案 2 :(得分:2)

根据@DCoder的评论,这是我的回答。 "%d"是指向两个字符数组%d的第一个字符的指针。将此递增一会给出d的指针。现在存在第二个参数的事实并不重要,因为表达式"%d"+1的结果只是字符d。如果您尝试添加0,则输出为5,符合预期。如果您尝试添加2,则没有输出,因为只有""传递给printf

答案 3 :(得分:1)

在这种情况下printf("%d"+1,a); = printf("d",a)

您指定printf从+1位置打印"d",因此printf只会在屏幕上打印d