Moh*_*hit 9 c printf programming-languages
GCC编译器如何解释以下行:
printf("HELLO");
Run Code Online (Sandbox Code Playgroud)
我想知道这个,因为当我运行以下程序时:
main()
{
printf(5+"Good Morning");
}
Run Code Online (Sandbox Code Playgroud)
该程序正在打印:
Morning
Run Code Online (Sandbox Code Playgroud)
为什么编译器从第六个字符开始打印?
Oli*_*rth 25
这是C指针算术的工件; printf只是一个红鲱鱼.
字符串文字的类型(例如"Good morning")" const char *.您的代码相当于:
const char *p = "Good morning";
p = p + 5;
printf(p);
Run Code Online (Sandbox Code Playgroud)
添加指针和整数会生成指向序列中第5个元素的指针.
Alo*_*hal 22
这里发生了很多事情.正如其他人所说,printf()不会"知道"有关表达的任何内容5+"Good Morning".该表达式的值由C语言确定.
首先,a+b是一样的b+a,所以5+"Good Morning"是一样的"Good Morning"+5.
现在,类型"Good Morning"(即字符串文字)是"数组char".具体来说,"Good Morning"是一个13个字符的数组(12个"常规"字符,后跟a 0).当在大多数表达式中使用时,C中的数组类型 "衰减"到指向其第一个元素的指针,而二进制加法就是这种情况.所有这些意味着in "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 |
+---+---+---+---+---+---+---+---+---+---+---+---+---+
Run Code Online (Sandbox Code Playgroud)
G加号5 的地址值是指向G上方5个位置的指针,即M.所以,printf()正在获得一个地址M. printf()打印,直到找到0.因此你Morning看作输出.
是和写作一样
char *ptr="Good Morning";
Run Code Online (Sandbox Code Playgroud)
其次是
printf( ptr + 5 );
Run Code Online (Sandbox Code Playgroud)
这是&ptr[5]该ADRESS点,"早晨";
向指针添加整数n会导致地址ptr + n*sizeof(type)