1、阅读程序题 导读:学会阅读程序对于初学者来说很重要,一方面可以巩固所学的语法知识,另一方面通过阅读别人写好的程序来打开自己的思路,就所谓见多识广。读者通过阅读理解程序,从给出的四个备选参考答案中,选择程序的正确输出。如果选择有误,就要认真分析原因,是概念方面的错误还是对程序逻辑理解不对,从而加深对语法规则的理解,提高程序设计能力。程序设计语言是开发程序的一个工具,学习语言的目的是为了编写程序来解决实际问题,所以特别提倡通过实际上机来检验备选答案,增强动手能力。习题基本上是按照教材的章节来安排的,读者可以根据学习的进度选择部分习题。 【2.1】以下程序的输出结果是 。 main( ) {
2、float a;
a=1/100000000;
printf("%g",a);
}
A) 0.00000e+00 B) 0.0 C) 1.00000e-07 D) 0
【2.2】下面程序的输出结果是____。
#include
3、n; int i=-521; n=i; printf("n=%u\n",n); } A) n=-521 B) n=521 C) n=65015 D) n=102170103 【2.4】以下程序的输出结果是 。 main( ) { int x=10, y=10; printf("%d %d\n", x――, ――y); } A) 10 10 B) 9 9 C) 9 10 D) 10 9 【2.5】以下程序的输出结果是____。 main() { int n=1; printf("%d %d %d\n",n,n++,n--); } A) 1 1 1 B) 1
4、0 1 C) 1 1 0 D) 1 2 1 【2.6】以下程序的输出结果是____。 main() { int x=0x02ff,y=0x0ff00; printf("%d\n",(x&y)>>4|0x005f); } A) 127 B) 255 C) 128 D) 1 【2.7】以下程序的输出结果是____。 main() { int a=1; char c='a'; float f=2.0; printf("%d\n",(!(a==0),f!=0&&c=='A')); } A) 0 B) 1 【2.8】下面程序的输出结果是____。 main
5、) { int a=1,i=a+1; do { a++ ; }while( !~i++ > 3); printf("%d\n",a); } A) 1 B) 2 C) 3 D) 4 【2.9】下面程序的输出结果是____。 main() { int a=111; a=a^00; printf("%d,%o\n",a,a); } A) 111,157 B) 0,0 C) 20,24 D) 7,7 【2.10】下面程序的输出结果是____。 main() { char s[12]= "a book"; printf("%.4s",s); } A)
6、 a book! B) a book!<四个空格》 C) a bo D) 格式描述错误,输出不确定 【2.11】下面程序的输出结果是____。 main() { int a,b; scanf("%2d%3d",&a,&b); printf("a=%d b=%d\n",a,b); } A) a=12 b=34 B) a=123 b=45 C) a=12 b=345 D) 语句右错误 【2.12】以下程序段的输出结果是 。 int a=10,b=50,c=30; if(a>b) a=b; b=c; c=a; printf("a=%d b=%d c=%d\n",a
7、b,c); A) a=10 b=50 c=10 B) a=10 b=30 c=10 C) a=50 b=30 c=10 D) a=50 b=30 c=50 【2.13】以下程序的输出结果是 。 main() { int a=0,b=1,c=0,d=20; if(a) d=d-10; else if(!b) if(!c) d=15; else d=25; printf("d=%d\n",d); } A) d=10 B) d=15 C) d=20 D) d=25 【2.14】下面程序的输出结果为 。 main() { int a=1,b=0; switch(
8、a) { case 1: switch (b) { case 0: printf("**0**"); break; case 1: printf("**1**"); break; } case 2: printf("**2**"); break; } } A) **0** B) **0****2** C) **0****1****2** D) 有语法错误 【2.15】以下程序的输出结果是 。 main() { char *s="12134211"; int v1=0,v2=0,v3=0,v4=0,k; for(k=0;s[k];k++) switch(s[k])
9、 { case '1': v1++; case '3': v3++; case '2': v2++; default: v4++; } printf("v1=%d, v2=%d, v3=%d, v4=%d\n",v1,v2,v3,v4); } A) v1=4,v2=2,v3=1,v4=1 B) v1=4,v2=9,v3=3,v4=1 C) v1=5,v2=8,v3=6,v4=1 D) v1=4,v2=7,v3=5,v4=8 【2.16】下面程序的输出是 。 main() { int x=1,y=0,a=0,b=0; switch(x) { case 1: swit
10、ch(y) { case 0: a++;break; case 1: b++;break; } case 2: a++;b++;break; } printf("a=%d,b=%d\n",a,b); } A) a=2,b=1 B) a=1,b=1 C) a=1,b=0 D) a=2,b=2 【2.17】下面程序的输出是____。 main() { int num=0; while(num<=2) { num++; printf("%d\n",num); } } A) 1 B) 1 C) 1 D) 1 2 2 2 3 3 4 【2.18】下面程序
11、的输出结果是____。
main()
{ int a=1,b=0;
do
{ switch(a)
{ case 1: b=1;break;
case 2: b=2;break;
default : b=0;
}
b=a+b;
}while(!b);
printf("a=%d,b=%d",a,b);
}
A) 1,2 B) 2,1 C) 1,1 D) 2,2
【2.19】从键盘上输入"446755"时,下面程序的输出是____。
#include
12、witch(c -'2') { case 0: case 1: putchar(c+4); case 2: putchar(c+4);break; case 3: putchar(c+3); default: putchar(c+2);break; } printf("\n"); } A) 888988 B) 668966 C) 88898787 D) 66898787 【2.20】下面程序的输出结果是____。 main() { int k=0; char c='A'; do { switch(c++) { case 'A': k++;break; ca
13、se 'B': k--; case 'C': k+=2;break; case 'D': k=k%2;contiue; case 'E': k=k+10;break; default: k=k/3; } k++; }while(c<'C') ; printf("k=%d\n",k); } A) k=1 B) k=2 C) k=3 D) k=4 【2.21】下面程序的输出结果是____。 main() { int x,i; for(i=1;i<=100;i++) { x=i; if(++x%2==0) if(++x%3==0) if(++x%7==0) pr
14、intf("%d ",x);
}
}
A) 39 81 B) 42 84 C) 26 68 D) 28 70
【2.22】下面程序的输出结果是____。
#include
15、3.6,2.4<回车>",下面程序的输出是____。
#include
16、i<2;i++) { x++; for(j=0;j<-3;j++) { if(j%2) continue; x++; } x++; } printf("x=%d\n",x); } A) x=4 B) x=8 C) x=6 D) x=12 【2.25】下面程序的输出结果是____。 main() { int i,j,k=10; for(i=0;i<2;i++) { k++; { int k=0; for(j=0;j<=3;j++) { if(j%2) continue; k++; } } k++; } printf("k=%d\n",k);
17、
}
A) k=4 B) k=8 C) k=14 D) k=18
【2.26】下面程序的输出结果是____。
#include
18、
#include
19、]+n[0][0] ); /* ① */
printf("%d\n", m[0][1]+n[1][0] ); /* ② */
}
① A) 0 B) 1 C) 2 D) 3
② A) 0 B) 1 C) 2 D) 3
【2.29】下面程序的输出结果是____。
#include
20、me string *test
【2.30】下面程序的输出结果是____。
#include
21、
strcpy( str + strlen(str)/2, "es she");
printf("%s\n", str);
}
A) How do you do B) es she C) How are you D) How does she
【2.32】下面程序的输出结果是____。
#include
22、}
A) 11 B) 20 C) 21 D) 31
【2.33】下面程序的输出结果是____。
#include
23、面程序的输出结果是____。
#include
24、③ A) 5,66 B) 1,66 C) 5,6 D) A,B,C参考答案都不对
【2.35】下面程序的输出结果是____。
#include
25、
int w=3;
main()
{ int w=10;
printf("%d\n",fun(5)*w);
}
fun(int k)
{ if(k==0) return(w);
return(fun(k-1)*k);
}
A) 360 B) 3600 C) 1080 D) 1200
【2.37】下面程序的输出结果是____。
#include
26、i<2;i++)
k=funa(a++);
printf("%d\n",k);
}
A) 3 B) 0 C) 5 D) 4
【2.38】下面程序的输出结果是____。
#include
27、2.39】下面程序的输出结果是____。
main()
{ int a=2,i;
for(i=0;i<3;i++)
printf("%4d",f(a));
}
f(int a)
{ int b=0;
static int c=3;
b++;
c++;
return(a+b+c);
}
A) 7 7 7 B) 7 10 13 C) 7 9 11 D) 7 8 9
【2.40】下面程序的输出结果是____。
#include
28、int i, x;
for(i=0; i<=2; i++ )
x=try( );
printf("%d\n", x);
}
A) 3 B) 4 C) 5 D) 6
【2.41】下面程序的输出结果是____。
#include
29、f("%d ", ++x);
}
A) 1 1 1 B) 2 2 2 C) 3 3 3 D) 3 2 1
【2.42】下面程序的输出结果是____。
#include
30、 printf("%d ",*(++p)); printf("%d ",*++p); printf("%d ",*(p--)); p+=3; printf("%d %d ",*p,*(a+3)); } A) 1 2 3 3 5 4 B) 1 2 3 4 5 6 C) 1 2 2 3 4 5 D) 1 2 3 4 4 5 【2.44】下面程序的输出结果是____。 main() { int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}; int *p=a; p+=6; printf("%d ",*p); /* ① */ printf
31、"%d ",*(*(a+6))); /* ② */
printf("%d ",*(a[1]+=2)); /* ③ */
printf("%d",*(&a[0][0]+6));/* ④ */
}
A) 7 7 7 7 B) ②句语法错误 C) ③句语法错误 D) ④句语法错误
【2.45】下面程序的输出结果是____。
#define FMT "%X\n"
#include
32、 ① */
printf( FMT, *(*(a+1)+1) ); /* ② */
}
① A) 9 B) 11 C) A D) B
② A) 6 B) 7 C) 8 D) 前面三个参考答案均是错误的
【2.46】下面程序的输出结果是____。
#include
33、D) 1,4,5 【2.47】下面程序的输出结果是____。 void ive(x,n) int x[],n; { int t,*p; p=x+n-1; while(x
34、
C) 1 3 5 7 9 2 4 6 8 0 D) 0 8 6 4 2 9 7 5 3 1
【2.48】下面程序的输出结果是____。
#include "string.h"
fun(char *w,int n)
{ char t,*s1,*s2;
s1=w;s2=w+n-1;
while(s1 35、C) 7171717 D) 1711717
【2.49】下面程序的输出结果是____。
#include 36、int f(), (*g)()=f;
printf("%d\n", (*g)(a,b) );
}
A) 1 B) 2 C) 3 D) 前面三个参考答案均是错误的
【2.51】下面程序的输出结果是____。
#include 37、pha[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 38、)
{ 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) mno 39、pqr 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 40、[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) 41、20 D) 21
【2.56】以下程序的输出结果是____。
#include 42、
{ 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语言允许在程序块(分程序)中说明 43、变量。
【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位为 44、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 45、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语言允许在程序块(分程 46、序)内说明变量,如果在程序块内说明的变量和程序块外的变量同名,在块外说明的变量在块内是不可见的。可将此题和【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,第一个参数给出 47、的地址是字符数组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屏蔽了 48、外部变量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函数 49、以外被说明,此处不是定义两个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]的地址。
50、
【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]"是取数组首元素的地址。对于指向数组首址的






