当我找到这段代码时,我正在处理一些面试问题。
#include<stdio.h>
int main()
{
short int a=5;
printf("%d"+1,a); //does not give compiler error
return 0;
}
它打印以下内容:
d
我无法理解printf函数在这里是如何工作的。
答案 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
。