【2.51】下面程序的输出结果是____。
#include
main( )
{ int a=1,*p,**pp;
pp=&p;
p=&a;
a++;
printf ("%d,%d,%d\n", a,*p, **pp);
}
A) 2,1,1 B) 2,1,2 C) 2,2,2 D) 程序有错误
【2.52】下面程序的输出结果是____。
main()
{ char *alpha[7]={"ABCD","EFGH","IJKL","MNOP","QRST","UVWX","YZ"};
char **p;
int i;
p=alpha;
for(i=0;i<4;i++)
printf("%c",*(p[i]));
printf("\n");
}
A) AEIM B) BFJN C) ABCD D) DHLP
【2.53】下面程序的输出结果是____。
#include
char *pp[2][3]={ "abc", "defgh", "ijkl", "mnopqr", "stuvw", "xyz"};
main ( )
{ printf("%c\n",***(pp+1)); /* ① */
printf("%c\n",**pp[0]); /* ② */
printf("%c\n",(*(*(pp+1)+1))[4]); /* ③ */
printf("%c\n",*(pp[1][2]+2)); /* ④ */
printf("%s\n",**(pp+1)); /* ⑤ */
}
① A) a B) d C) i D) m
② A) a B) d C) i D) m
③ A) h B) l C) q D) w
④ A) k B) o C) u D) z
⑤ A) ijkl B) mnopqr C) stuvw D) xyz
【2.54】下面程序的输出结果是____。
#include "stdio.h"
struct str1
{ char c[5];
char *s;
};
main( )
{ struct str1 s1[2]={ {"ABCD""EFGH"},{"IJK","LMN"} };
struct str2
{ struct str1 sr;
int d;
}s2={"OPQ","RST",32767};
struct str1 *p[2];
p[0]=&s1[0];
p[1]=&s1[1];
printf("%s",++p[1]->s); /* ① */
printf("%c",s2.sr.c[2]); /* ② */
}
① A) LMN B) MN C) N D) IJK
② A) O B) P C) Q D) R
【2.55】以下程序的输出结果是____。
struct st
{ int x,*y;
}*p;
int s[]={10,20,30,40};
struct st a[]={1,&s[0],2,&s[1],3,&s[2],4,&s[3]};
main()
{ p=a;
printf("%d\n",++(*(++p)->y));
}
A) 10 B) 11 C) 20 D) 21
【2.56】以下程序的输出结果是____。
#include
main()
{ union EXAMPLE
{ struct
{ int x,y;
}in;
int a,b;
}e;
e.a=1;e.b=2;
e.in.x=e.a*e.b;
e.in.y=e.a+e.b;
printf("%d,%d\n",e.in.x,e.in.y);
}
A) 2,3 B) 4,4 C) 4,8 D) 8,8
【2.57】下面程序的输出结果是____。
#include
main()
{ union
{ int i[2];
long k;
char c[4];
}r,*s=&r;
s->i[0]=0x39;
s->i[1]=0x38;
printf("%c\n",s->c[0]);
}
A) 39 B) 9 C) 38 D) 8
【2.58】下面程序的输出是 。
main ( )
{ printf("%d\n", EOF);
}
A) -1 B) 0 C) 1 D) 程序是错误的
【阅读程序题参考答案】
【2.1】参考答案:D
注释:程序中除法运算的两个操作数均是整型,运算结果也是整型。
【2.2】参考答案:B
注释:C语言允许在程序块(分程序)中说明变量。
【2.3】参考答案:C
注释:变量i中的负号传送给变量n后,因n是无符号数,已不作为负号处理。
【2.4】参考答案:D
注释:对变量x的――操作是后缀形式,变量x的减1操作要在执行完 printf函数之后才进行,所以变量x的值在输出的时候仍然保持原值10。
【2.5】参考答案:B
注释:C语言在执行printf()时,对函数中的表达式表列的处理顺序是从后向前,即先处理n- -,再处理n++,最后处理n,而且每一个表达式作为一个处理单元,也就是说在不同的表达式中自增自减运算是单独考虑的。
【2.6】参考答案:A
注释:变量x和变量y做按位与,结果为0x0200,右移4位为0x0020,再与0x005f做按位或,最后结果为0x007f。
【2.7】参考答案:A
注释:逗号表达式的结果是用逗号分开的最后一个表达式的值,此题由于 c=='A'的值是0,所以逗号表达式的值为0。
【2.8】参考答案: B
【2.9】参考答案: A
【2.10】参考答案: C
注释:在输出格式描述"%m.ns"中,m是输出总长度,n是实际字符的个数,这里m没有给出,则输出总长度就是实际输出字符的个数。
【2.11】参考答案: C
【2.12】参考答案:B
【2.13】参考答案:C
【2.14】参考答案:B
【2.15】参考答案:D
【2.16】参考答案:A
【2.17】参考答案: C
【2.18】参考答案:A
【2.19】参考答案: C
注释:在switch语句中,case本身仅起到语句标号的作用,不会改变语句的流程,执行break语句才能退出当前的switch语句。
【2.20】参考答案: D
注释:siwtch语句的表达式中,变量c是后缀的增一运算,第一次执行do-while循环时,执行case 'A'后面的语句。
【2.21】参考答案: D
【2.22】参考答案: B
【2.23】参考答案: B
注释:fabs()是浮点数绝对值函数。
【2.24】参考答案: A
【2.25】参考答案: C
注释:C语言允许在程序块(分程序)内说明变量,如果在程序块内说明的变量和程序块外的变量同名,在块外说明的变量在块内是不可见的。可将此题和【2.11】进行比较,加深理解。
【2.26】参考答案: C
【2.27】参考答案: B
【2.28】参考答案: ① D ② A
【2.29】参考答案:D
【2.30】参考答案: B
注释:输出结果为字符串长度。
【2.31】参考答案: D
注释:字符串拷贝函数strcpy()要求的两个参数都是字符串首地址。本题中第二个参数是字符串常量,接受这个字符串的第一个参量不是直接给出字符数组名,而是进行了地址运算后的结果。由于str字符串的长度是13,除2取整后是6,第一个参数给出的地址是字符数组str的首地址加6,也就是原来字符串中第二个空格的位置,把"es she"从该处放入,字符串str变为"How does she"。
【2.32】参考答案: C
注释:main函数调用func函数时,第一个实参使用的是逗号表达式的值,也就是x+y的结果。由于对变量x、y、z进行的是后缀运算,所以函数func的参数值是13和8。
【2.33】参考答案: C
【2.34】参考答案: ① C ② A ③ C
【2.35】参考答案: C
【2.36】参考答案: B
注释:函数fun进行了递归调用,实际进行的运算是5×4×3×2×1×3×10。主函数内说明的局部变量w屏蔽了外部变量w,所以在主函数中外部变量w是不可见的,在调用printf函数时表达式"fun(5)*w"中w的值是10。
【2.37】参考答案: D
注释:main函数三次调用了函数funa,在funa函数中的静态变量c仅在第一次调用时进行了初始化,再次调用时不再对静态变量赋初值。
【2.38】参考答案: B
注释:main函数和num函数中都说明了变量a和b,由于它们是内部变量,所以它们分别在说明它们的函数内有效。外部变量x和y在函数num之后被说明,而在num函数中又要引用它们,所以在num函数中用关键字"extern"说明变量x和y是一个外部变量,也就是通知计算机这两个变量在fun函数以外被说明,此处不是定义两个int型变量。
【2.39】参考答案: D
注释:函数f中的变量c是静态变量,仅在第一次调用函数f时它被初始化为3,第二次调用函数f时c的值是4,第三次调用函数f时c的值是5。
【2.40】参考答案: D
【2.41】参考答案: D
注释:程序中有三个"x"分别在三个不同的函数中,这三个"x"都是自动变量,所以三个"x"分别局部于三不同的函数,在三个函数中对"x"的操作互不影响。
【2.42】参考答案: A
【2.43】参考答案: A
注释:*(++p)和*++p都是指针变量值前加1,第一次指向a[1],第二次指向a[2];a+3是a[3]的地址。
【2.44】参考答案: C
注释:②句没有语法错误,但是a+6指向数组之外,因为a是a[0]的地址,a+1是a[1]的地址,a+2是a[2]的地址,显然数组a没有a[6]分量。③句错误,因为a[1]是地址常量,它是a[1][0]的地址,对于地址常量是不可以进行赋值运算的。
【2.45】参考答案: ① D ② A
注释:如果FMT定义为"%x\n",则输出的16进制数据用小写字母表示。
【2.46】参考答案: A
注释:语句"p=&a[0]"表示将数组a中元素a[0]的地址赋给指针变量p,则p就是指向数组首元素a[0]的指针变量,"&a[0]"是取数组首元素的地址。对于指向数组首址的指针,p+i(或a+i)是数组元素a[i]的地址,*(p+i)(或*(a+i))就是a[i]的值。
【2.47】参考答案: B
【2.48】参考答案: D
【2.49】参考答案: D
【2.50】参考答案: A
注释:变量g是指向函数的指针,(*g)(a,b)是调用指针g所指向的函数。
【2.51】参考答案: C
注释:p是指针,pp是指向指针的指针。
【2.52】参考答案: A
注释:对于指向数组的指针变量可以做下标运算,p[i]和alpha[i]都是指向字符串的首地址,*p[i]取出字符串的第一个字符。
【2.53】参考答案: ① D ② A ③ D ④ D ⑤ B
注释:pp是一个二维指针数组,pp+1指向数组的第二维,*(pp+1)是第二维的起始地址,**(pp+1)是第二维第一个元素的地址,***(pp+1)是第二维第一个元素的内容,所以,①的参考答案应选D。*(pp+1)+1是第二维第二个元素的地址,*(*(pp+1)+1)是第二维第二个元素,(*(*(pp+1)+1))[4]则是第二维第二个元素所指字符串下标为4的元素,即是字符w,故③应当选D。
【2.54】参考答案: ① B ② C
【2.55】参考答案:D
【2.56】参考答案:C
注释:联合体成员的取值是最后一次给成员赋的值。
【2.57】参考答案: B
注释:整型数组i和字符数组c共用存储空间,给i赋值也等于给c赋值,所以s->c[0]=0x39,所以输出9。
【2.58】参考答案:A
注释:基本概念。EOF是由C语言在头文件stdio.h中定义的,用户可以直接使用。