📜  门| GATE IT 2006 |第49章

📅  最后修改于: 2021-06-29 23:24:35             🧑  作者: Mango

执行以下程序时,将打印以下给出的哪个选择?

#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贡献的
这个问题的测验