无法理解C代码的输出

时间:2014-07-27 08:49:15

标签: c

#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
}

我无法理解上述程序给出的输出。我是新手。如果我必须知道指针中的高级主题吗?

5 个答案:

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