执行以下程序时,将打印以下给出的选项中的哪一项?
#include
struct test {
int i;
char *c;
}st[] = {5, "become", 4, "better", 6, "jungle", 8, "ancestor", 7, "brother"};
main ()
{
struct test *p = st;
p += 1;
++p -> c;
printf("%s,", p++ -> c);
printf("%c,", *++p -> c);
printf("%d,", p[0].i);
printf("%s \n", p -> c);
}
(A)丛林, n, 8, nclastor
(B) etter, u, 6, ungle
(C) cetter, k, 6, 丛林
(D) etter, u, 8, 祖先答案:(乙)
解释:
基本要求——结构知识
struct test *p = st;
st 是一个结构数组,其中整数是结构的“i”变量,字符数组是结构的“c”变量。
p 是结构测试类型的指针,指向结构数组(第一个元素)。 p 包含 st 数组中第一个结构的基地址,即 { 5, become}。
p += 1;
该语句将 p 加 1,这意味着 p 现在指向下一个结构(因为 p 是结构 test 类型的指针,因此将其加 1 将跳转一个结构)。 p 现在指向 {4, better}。
在继续进一步的陈述之前,我们首先讨论运算符及其优先级。
“->”是结构运算符,它获取被引用的结构的成员。它比递增/递减(++、–)和解引用操作(*)具有更高的优先级。
现在简要讨论后增量和前增量运算符。
预递增运算符用于在表达式中使用之前递增变量的值。在 Pre-Increment 中,值首先递增,然后在表达式内部使用。
后增量运算符用于在使用后增量的表达式完全执行后立即增加变量的值。在 Post-Increment 中,值首先在表达式中使用,然后递增。
++p -> c;
在此语句中,结构运算符(更高优先级)将首先使 p 指向结构内的 c 变量。现在指针是字符数组内,现在增加的字符数组“C”的指针将跳字符数组一个字符。因此字符数组现在从“e”开始。
p->c将结构内的指针移动到变量“c”。
printf("%s,", p++ -> c);
在此语句中使用了后增量运算符。首先将执行语句,然后运算符将工作。当前 p 指向第二个结构 { 4, better} 并且在结构内部,由于前面的语句,字符数组从 e 开始,因此 p->c 将打印字符串“etter”,之后后增量运算符将增加结构p 现在将指向下一个结构。
printf("%c,", *++p -> c);
在这个语句中,p->c 指向“jungle”(p 当前指向第三个结构 {6,jungle})然后预增运算符就像在前面的预增语句中移动一个字符,现在指针指向“u ”,这里的解引用运算符在指针指向的地址处打印值,并且由于指针指向“u”,因此打印 u。
printf("%d,", p[0].i);
在这个语句中,p[0] 将给出 p 当前指向的地址,即 {6,jungle},结构运算符(.) 将指向结构打印 6 的“i”变量。
printf("%s \n", p -> c);
这个语句打印到其中p当前指向该结构的并且由于因为字符数组的较早增量,字符数组从“U”,因此“ungle”开始被打印。
此解释由Parul Sharma 提供。
这个问题的测验