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