2010-07-26 81 views
9

如何以下行通过GCC编译器的解释:如何解释printf语句?

printf("HELLO"); 

我想知道这是因为当我运行下面的程序:

main() 
{ 
    printf(5+"Good Morning"); 
} 

该计划是打印:

Morning 

编译器为什么从第六个字符开始打印?

回答

22

这里发生了很多事情。正如其他人所说,printf()不知道有关表达式5+"Good Morning"的任何内容。该表达式的值由C语言确定。

首先,a+b相同b+a,所以5+"Good Morning"相同"Good Morning"+5

现在,"Good Morning"(即字符串文字)的类型是“数组char”。具体而言,"Good Morning"是13个字符的数组(12“常规”字符,后跟0)。在大多数表达式中使用时,type of an array in C会“衰减”为指向其第一个元素的指针,而二进制加法就是这种情况。这一切都意味着在"Good Morning"+5,"Good Morning"衰减到一个指向它的第一个元素,即字符G

这里是存储器的样子:

0 1 2 3 4 5 6 7 8 9 0 1 2 
+---+---+---+---+---+---+---+---+---+---+---+---+---+ 
| G | o | o | d | | M | o | r | n | i | n | g | 0 | 
+---+---+---+---+---+---+---+---+---+---+---+---+---+ 

G加5的地址的值是一个指向上述从G 5个地点,这是M一个指针。因此,printf()获得的地址是Mprintf()打印,直到找到0。因此,您将看到Morning作为输出。

+5

+ +1为了不贬低它(尤其是“在大多数表达式中,C中数组的类型”衰减“为指向其第一个元素的指针”而不是“la la la,数组是指针,la la la la “) – detly 2010-07-26 08:38:41

7

是相同的写作之后

printf(ptr + 5); 

这是&ptr[5]这个ADRESS点 “晨报”

char *ptr="Good Morning"; 

;

添加一个整数n的指针的结果到ADRESS的ptr + N *的sizeof(类型)

4

由于"Good Morning"是一个字符串指针(实际上到它的第一个字节)并加入5至该指针产生一个指向第5个字符的指针。 C字符串以空字符结尾,因此无论哪种方式,printf都会运行,直到它在结尾处遇到空字符为止。

25

这是一个C指针算术的工件; printf只是一个红鲱鱼。

类型的字符串的文字(如"Good morning“)是const char *您的代码等价于:。

const char *p = "Good morning"; 
p = p + 5; 
printf(p); 

添加一个指针和一个整数产生一个指针,指向在序列中的第5个元素

+0

Downvoter:care to comment? – 2012-01-10 10:51:40

3

它通过5个字节进入输入指针,并因此跳过单词“好”。

这是C. pointer arithmetic

让我们假设在字符串的基础指针“早上好”为p,和5 + P = + 5和它指向信M.

因此,输入对printf是从信指针M.