printf语句是如何解释的?

GCC编译器如何解释以下行:

printf("HELLO"); 

我想知道这个,因为当我运行以下程序时:

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

该程序正在打印:

 Morning 

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

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

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

现在, "Good Morning"的类型(即字符串文字)是“ char数组”。 具体来说, "Good Morning"是一个13个字符的数组(12个“常规”字符,后跟0 )。 当在大多数表达式中使用时,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视为输出。

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

字符串文字的类型(例如"Good morning ”)是const char * 。 您的代码相当于:

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

添加指针和整数会产生指向序列中第5个元素的指针。

是和写作一样

 char *ptr="Good Morning"; 

其次是

 printf( ptr + 5 ); 

这是&ptr[5]这个地址指的是“早晨”;

将一个整数n添加到指针会产生一个地址ptr + n * sizeof(type)

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

它使输入指针前进5个字节,因此跳过单词“Good”。

这是C中的指针算术 。

让我们假设字符串“早安”的基指针是p,并且5 + p = p + 5并且它指向字母M.

因此printf的输入是来自字母M的指针。