printf语句是如何解释的?
GCC编译器如何解释以下行:
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
)。 当在大多数表达式中使用时,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的指针。