printf语句是如何解释的?

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看作输出.

  • 为了不降低它的+1(特别是"在大多数表达式中,C中数组的类型"衰减"指向其第一个元素的指针"而不是"la la la,数组是指针,la la la" ) (5认同)

sta*_*ker 7

是和写作一样

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)