如何以下行通过GCC编译器的解释:如何解释printf语句?
printf("HELLO");
我想知道这是因为当我运行下面的程序:
main()
{
printf(5+"Good Morning");
}
该计划是打印:
Morning
编译器为什么从第六个字符开始打印?
如何以下行通过GCC编译器的解释:如何解释printf语句?
printf("HELLO");
我想知道这是因为当我运行下面的程序:
main()
{
printf(5+"Good Morning");
}
该计划是打印:
Morning
编译器为什么从第六个字符开始打印?
这里发生了很多事情。正如其他人所说,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()
获得的地址是M
。 printf()
打印,直到找到0
。因此,您将看到Morning
作为输出。
是相同的写作之后
printf(ptr + 5);
这是&ptr[5]
这个ADRESS点 “晨报”
char *ptr="Good Morning";
;
添加一个整数n的指针的结果到ADRESS的ptr + N *的sizeof(类型)
由于"Good Morning"
是一个字符串指针(实际上到它的第一个字节)并加入5至该指针产生一个指向第5个字符的指针。 C字符串以空字符结尾,因此无论哪种方式,printf
都会运行,直到它在结尾处遇到空字符为止。
这是一个C指针算术的工件; printf
只是一个红鲱鱼。
类型的字符串的文字(如"Good morning
“)是const char *
您的代码等价于:。
const char *p = "Good morning";
p = p + 5;
printf(p);
添加一个指针和一个整数产生一个指针,指向在序列中的第5个元素
Downvoter:care to comment? – 2012-01-10 10:51:40
它通过5个字节进入输入指针,并因此跳过单词“好”。
这是C. pointer arithmetic
让我们假设在字符串的基础指针“早上好”为p,和5 + P = + 5和它指向信M.
因此,输入对printf是从信指针M.
+ +1为了不贬低它(尤其是“在大多数表达式中,C中数组的类型”衰减“为指向其第一个元素的指针”而不是“la la la,数组是指针,la la la la “) – detly 2010-07-26 08:38:41