以下是代码...我想知道它实际上是如何工作的,那么为什么输出是这样的呢?
{
printf(5 + "GeeksQuiz");
return 0;
}
输出:测验
答案 0 :(得分:1)
该行为归因于指针算法。 "GeeksQuiz"
的类型为char[10]
(即9个字符加上末尾的\0
空字符),表达式5 + "GeeksQuiz"
返回指向"的第6个元素的指针。 GeeksQuiz" (即&(char[5])
)。因此,printf
打印"Quiz"
。
答案 1 :(得分:1)
#include <stdio.h>
int main (void) {
printf(5 + "GeeksQuiz");
return 0;
}
要了解其工作原理,请先从man 3 printf
开始。查看相关部分,您会发现:
The functions in the printf() family produce output according to a format
as described below. ...
The format string is a character string, beginning and ending in its initial
shift state, if any. ...
Each conversion specification is introduced by the character %, and ends with
a conversion specifier.
好的,让我们看一下我们所拥有的东西:
printf(5 + "GeeksQuiz");
格式字符串 - 必须为"GeeksQuiz"
; 开始并以初始班次状态结束 - 必须是 5 ;其中每个转化规范由字符%
引入,并以conversion specifier
结尾 - 我没有看到任何介绍%
所以必须在字符串中没有转换规范。 ...
因此,我们看来printf
的{{1}}的格式字符串和"GeeksQuiz"
的初始移位状态。这是怎么回事?
5
因此,通过在 GeeksQuiz
---------
012345678 -- 9 characters, character indexes 0-8
---------
--> 12345 -- shift state of 5, that's indexes 0-4
-----Quiz -- leaves us with Quiz
停止 1 ,我们确切地了解了man 3 printf
是什么以及它为什么会这样做。
答案 2 :(得分:0)
首先,printf中的内容在编译时被解释,然后才被提取到printf语句。
此处字符串“GeeksQuiz”衰减到指向其第一个元素的指针或被解释为指向字符串的指针。如果它是一个简单的声明,如
printf("GeeksQuiz");
编译器将返回字符串中第一个元素的地址“G”,printf将打印它直到遇到\ 0。
但在上述情况下
printf(5 + "GeeksQuiz"); OR
printf("GeeksQuiz" + 5);
将执行二进制添加“G”和5的地址,生成的新地址将返回到printf。
以下是内存的样子:
0 1 2 3 4 5 6 7 8 9
+---+---+---+---+---+---+---+---+---+---+
| G | e | e | k | s | Q | u | i | z | 0 |
+---+---+---+---+---+---+---+---+---+---+
因此你可以这么说,printf会从字符串中的第5个字符开始打印字符串,从0开始,即“Q”,
或它跳过5个字符并打印给定的字符串。
因此输出“测验”。
答案 3 :(得分:0)
字符串文字"GeeksQuiz"
的类型为char[]
:
“在C中,字符串文字的类型为char [],...”[string literal]
但是,此字符串文字左值会隐式转换为pointer to char
类型的 prvalue :
“类型为”NT“或”未知T的数组“的左值或右值可以隐式转换为”指向T的指针“的prvalue。结果指针指向数组的第一个元素“。 [Implicit conversions]
其余的应该是不言自明的,我会引用 40两个的回复来得到一个完整的答案:
该行为归因于指针算法。 “GeeksQuiz”的类型为char [10](即9个字符加上末尾的\ 0 null字符),表达式5 +“GeeksQuiz”返回指向“GeeksQuiz”的第六个元素的指针(即&amp;(char) [5]))。因此,printf打印“测验”。 [40two's answer]