#include<stdio.h>
int main()
{
int a=5;
printf("%d \n"+1,a); // output : d
printf("%%d \n"+1,a); // output : 5
printf("%q \n"+1,a); // output : q
printf("%%q \n"+1,a); // output : q
printf("%k \n"+1,a); // output : k
printf("%%k \n"+1,a); // output : k
printf("ABCD \n"); // output : ABCD
printf("ABCD \n" +1); // output : BCD
printf("ABCD \n" +3); // output : D
}
我无法理解上述程序给出的输出。我是新手。如果我必须知道指针中的高级主题吗?
答案 0 :(得分:7)
"%d \n"+1
返回指向包含"d \n"
的空格的指针。同样,"%%d \n"+1
返回指向"%d \n"
的指针。
因此,陈述
printf("%%d \n"+1,a); // output : 5
相当于
printf("%d \n", a);
这就是它输出5的原因。
对于等同于"%%q \n"+1
的{{1}},%q \n
不是预定义的格式说明符,并且行为未定义(请参阅C1X第315页)。 / p>
其他陈述的答案是相似的。
答案 1 :(得分:0)
分析printf("%d \n"+1,a)
:
传递给printf
的第一个参数是内存中字符串的地址
此字符串包含多个ASCII字符,以0字符结尾
在您的情况下,您传递字符串"%d \n"
+ 1
所以printf
&#34;看到的第一个字符&#34;是'd'
(而不是'%'
)
因此,您正在打印"d \n"
并且忽略参数a
答案 2 :(得分:0)
printf("%%d \n"+1,a)
等于printf("%d \n",a)
,因此正在打印5
。
printf("ABCD \n" +1);
此处编译器将从位置1读取B,因此它等同于printf("BCD \n" );
printf("%d \n"+1,a); // output : d here compiler reads d\n
printf("%%d \n"+1,a); // output : 5 here compiler reads %d\n
printf("%q \n"+1,a); // output : q here compiler reads q\n
printf("%%q \n"+1,a); // output : q here compiler reads %q\n
printf("%k \n"+1,a); // output : k here compiler reads k\n
printf("%%k \n"+1,a); // output : k here compiler reads %k\n
printf("ABCD \n"); // output : ABCD
printf("ABCD \n" +1); // output : BCD here compiler reads BCD\n
printf("ABCD \n" +3); // output : D here compiler reads D\n
答案 3 :(得分:0)
是的,这与指针有关。如果将ABCD
字符串常量分配给局部变量,它将如下所示:
char* s = "ABCD";
s
变量是指向字符串第一个字符A的指针。printf
函数从指针打印到字符串结尾。
指针有一个类型,这里是char
。如果将1添加到指针上,则结果指针指向旧存储器地址加上指针类型的大小。因此,在ABCD中指向A的指针中添加1将重新指向B的指针。当它传递到printf时,它再次打印到字符串的末尾,从B开始。
这应该足以解释其他输出。
答案 4 :(得分:0)
printf采用const char *指针。您使用的字符串是字符串litterals,它是从头开始存储在程序中的常量。然后,您将指向字符串开头的指针传递给printf。但是当你做+ n时,你会做指针算术。编译器知道你有一个char类型,并用一个增加指针值。这意味着printf永远不会看到前n个字符。
例如,如果“ABC”从地址100开始,B将在地址101上,C在102上,隐藏0(字符串的结尾)在103上。编译器将“ABC”+ 1解释为100+ 1,并将101传递给printf,这将很好地处理从地址101开始的字符串。从而打印“BC”