1.有以下程序
int a=3;
main()
{int s=0;
{int a=5; s+=a++; }
s+=a++; printf("%d\n",s);
}
程序运行后的输出结果是_______。
选项:A.8 B.7 C.10 D.11 评析:选项A的错误在于switch语句后面
不该加分号;
选项B的错误在于switch语句要求
每一个case的常量表达式的值必须互不相
同;
选项C的错误在于变量a应该用括号
括起来,case后面应该是常量表达
式,而不是变量。
本题答案为D。
2.若有说明:int n=2,*p=&n,*q=p;,则
以下非法的赋值语句是______。
选项:A.*p=*q B. p=q C.n=*q D.p=n
评析:本题的考查点是指针变量的引用。
指针变量不同于整型变量和其它类型
的变量,它是用来存放地址(指针)的,不
能将一个整型量(或任何其它非地址类型的
数据)赋给一个指针变量,这样的赋值是不
合法的。本题中的答案D就属于这种情况,
所以p=n;是非法的赋值语句。
故本题答案为D。
3.在说明语句:int *f();中,标识符f
代表的是______。
选项:A.一个用于指向整型数据的指针变
量
B.一个用于指向函数的指针变量
C.一个用于指向一维数组的行指
针
D.一个返回值为指针型的函数名
评析:int * f() 表示f是一个函数,它带
回一个指针值,这个指针是指向一个整型数
据的。本题答案为D。4.以下程序的输出结果是______。
int f( )
{ static int i=0;
int s=1;
s+=i; i++;
return s;
}
main()
{ int i,a=0;
for(i=0;i<5;i++) a+=f( );
printf("%d\n",a);
}
选项:A.15 B.24 C.25 D.20 评析:本题主要考的是对变量存储属性的理解,一个变量被指定为静态变量,在编译时就为其分配了存储空间,程序一开始执行便被建立,直到该程序执行结束都存在,而不像动态变量只存在于函数或分程序被调用期间。在函数多次被调用的过程中静态局部变量的值具有可继承性。在第一次调用函数结束时,i的值是1,返回值1,第二次调用函数时,i的值保持为1,执行自加操作后,i的值变成了2,到了第三次调用时,i的值保持了上次调用结束时的值,再执行自加,值变成了3。到第五次调用结束时,i的值是5。而s的值不具备i的这种可继承性,每次调用时,它都先被重新赋值为1,再执行下面的操作。
本题答案为D。
5.有以下程序
main()
{ int i=0,s=0;
do{
if(i%2){i++;continue;}
i++;
s+=i;
} while(i<7);
printf("%d\n",s);
}
执行后输出的结果是______。
选项:A.21 B.28 C.16 D.12评析:本题的考查点是do-while循环
语句。
do-while的一般格式如下所示:
do
{语句;
}while(测试表达式);
do-while语句是先执行后判断,其执行流程是:
1、执行循环体;
2、计算测试表达式,若为非0,转向执行do,否则执行while下面的一条语句;
3、执行do-while后面的语句,即退出do-while循环。
本题中,当i=0时,i%2=0,为假不执行{i++;continue;},接着往下执行i++,此时i=1,s=s+i=1,因为i=1符合条件i<7继续循环执行,i=1时以此类推,直到i>=7时结束循环。最后得出s=16。故本题答案为A。
6.下面程序的输出结果是______。
main()
{ int
a[]={1,2,3,4,5,6,7,8,9,0},*p;
p=a;
printf("%d\n",*p+9);
选项:A.1 B.0 C.10 D.9
评析: 本题中,p=a,则表明指针p指向数组a的第一个元素,即a[0]。指针运算符"*"的优先级高于加法运算符"+",所以"*p+9"相当于a[0]+9,即10。
本题答案为C。
7.有以下程序
int a=2;
int f(int *a)
{return (*a)++;}
main()
{ int s=0;
{int a=5;
s+=f(&a);
}
s+=f(&a);
printf("%d\n",s); }
执行后输出结果是______。
选项:A.8 B.10 C.9 D.7
评析:在一个函数的内部定义的变量是内
部变量,它只在本函数范围内有效,也就是
说只有在本函数内才能使用它们,在此函数
以外是不能使用这些变量的。本题中的int
a=5;只在{int a=5;s+=f(&a);}内有效。
在函数之外定义的变量称为外部变量,
外部变量是全局变量。全局变量可以为本文
件中其它函数所共用。它的有效范围为:从
定义变量的位置开始到本源文件结束。本题
的开头int a=2;即为全局变量,实际上起作
用的也就是这个。
故本题答案为C。
8.有如下程序
main()
{ float x=2.0,y;
if(x<0.0) y=0.0;
else if(x<10.0)y=1.0/x;
else y=1.0;
printf("%f\n",y);
}
该程序输出结果是______。
选项:A.0.000000 B.0.250000 C.1.000000 D.0.500000
评析:本题考查的是if…else语句的
使用。x=2.0,符合第二个if语句的条件
x<10.0,所以执行y=1.0/x语句,即
y=1.0/2.0=0.500000。
本题答案为C。
9.若已定义:int a[9],*p=a;并在以后的
语句中未改变p的值,不能表示a[1]地址的
表达式是______。
选项:A.p+1 B.++p C.a++ D.a+1
评析:本题的考查点是数组地址的表示。
选项C中,数组名所表示的数组地址不
能被重新赋值。
本题答案为C。
10.设a=5、b=6、c=7、d=8、m=2、n=2,
执行
(m=a>b)&&(n=c>d)
后n的值为______。
选项:A.4 B.2 C.3 D.1 评析:本题的考查点是逻辑与运算。
在逻辑表达式的求解中,并不是所有的逻辑运算符都被执行,只是在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符。本题中,(m=a>b)的值为0,求出整个表达式的值为0,不需执行(n=c>d),所以n仍为2。
故本题答案为B。
11.下列选项中正确的语句组是
______。
选项:A.char *s; s="Beijing"
B.char s[8]; s="Beijing"
C.char s[8]; s={"Beijing"}
D.char *s; s={"Beijing"}
评析:本题的考查点是字符串的定义和赋初值。
选项A、C是对字符数组初始化,可以是逐个字符赋给数组中各元素,也可以对整个字符串赋初值,但必须是字符型(s型),并且C语言规定,只有静态存储(static)数组和外部存储(extern)数组才能初始化。所以选项A、C都不对。应该这样来实现:static char s[ ]="Beijing";选项B、D 是想通过字符指针来实现,正确的格式是char *s; s="Beijing"。
故本题答案为D。
12.设有如下程序段
char s[20]="Beijing",*p;
p=s;
则执行p=s;语句后,以下叙述正确的是______。
选项:A.s和p都是指针变量
B.s数组中元素的个数和p所指字符串长度相等
C .可以用*p表示s[0]
D .数组s中的内容和指针变量p中的内容相同
13.有以下程序main()
{ int m=3,n=4,x;
x=-m++;
x=x+8/++n;
printf("%d\n",x);
}
程序运行后的输出结果是______。
选项:A.-1 B.5 C.3 D.-2
评析:本题考查的是混合运算。
此题考的是++在变量前或变量后如何
作用。++在变量前和变量后的唯一区别就在
于在执行“++变量”所在的语句时,是先将
变量加1再执行它所在语句还是先执行它所
在的语句再使变量加1,当++在变量后时,
也就是“变量++”,那就是先将变量值代入
表达式运算后再使变量加1;而“++变量”
是先使变量加1,再把加1后的结果放入表
达式进行运算。这两种情况,在执行完变量
所在的语句后,它们在内存中的值都是加过
1之后的值了。所以本题中x=-m++执行后
x=-3,而执行x=x+8/++n时,必须先将n加
1,再代入表达式运算。
所以答案为D。
14.设有条件表达式:(EXP)?i++:j--,
则以下表达式中与(EXP)完全等价的是
______。
选项:A.(EXP==1) B.(EXP!=0)
C.(EXP==0) D.(EXP!=1)
评析:
本题的考查点是C语言条件运算。
条件运算符有三个操作数。它的形式
是:(EXP)?exp1:exp2。如果EXP的值为非
零,那么整个表达式的值就是表达式exp1
的值,如果EXP的值为零,那么整个表达式
的值就是exp2的值。选项B的功能是判断
EXP的值的是否不为0,如果不为0,则
"(EXP!=0)"的值为真;否则,"(EXP!=0)"的
值为假,与题面的条件表达式意思一致。
故本题答案为B。
15.设有以下定义
union data
{ int d1; float d2; } demo;
则下面叙述中错误的是______。
A.变量demo与成员d2所占的内存字节数相同
B.若给demo.d1赋99后,demo.d2中的值是99.0
C.变量demo和各成员的地址相同
D .变量demo和各成员的地址相同
评析:本题的考查点是共用体的存储特点。
共用体的存储特点:
(1)同一块内存可以存放不同类型的数据,但在某一时刻只能存放其中的一种;
(2)共用体变量中起作用的成员是最后一次存放的成员,即在存入一个新的成员后原有的成员失去作用,所以选项D的说法是错误的;
(3)共用体变量的地址和它的成员的地址是同一个地址,且各成员的地址也相同,因为共用体成员是共同占用同一段存储空间的,所以选项B,C的说法都正确;
(4)共用体变量不能整体被赋值,也不能给共用体变量赋初值;
(5)共用体所占的内存长度等于最长的成员的长度,所以选项A的说法正确。
故本题答案为D。
16.请读程序:
#include
#include
main()
{
char *s1="AbCdEf", *s2="aB"; s1++; s2++;
printf("%d\n",strcmp(s1,s2) ); }
上面程序的输出结果是______。
选项:A.正数 B.负数 C.零D.不确定的数
评析:本题的考查点是字符串比较函数strcmp()的应用。
strcmp(X1,X2)是串比较函数,当X1>X2时返回值为正数,当X1 本题中"s1"、"s2"分别表示这两个串中第一个字符的地址,s1++和s2++是将指针指向串的第二个字符,指针变量s1指向的是串"bCdEf"的首地址,即"b"的地址,而指针变量s2指向的是"B"的地址。而在字符串比较中,大小的确定是各个字符串相应位置字符的ASCII码值的大小决定的,"B"的ASCII 码值为66,"b"的ASCII码值为98,所以 s1>s2,返回值为正数。 故本题答案为A。 17.若a、b、c1、c2、x、y均是整型变量, 正确的switch语句是______。 ① switch(a+b); { case 1:y=a+b;break; case 0:y=a-b;break; } ② switch(a*a+b*b) { case 3: case 1:y=a+b;break; case 3:y=b-a;break; } ③ switch a { case c1:y=a-b;break; case c2:x=a*b;break; default:x=a+b; } ④ switch (a-b) { default:y=a*b;break; case 3:case 4:x=a+b;break; case 10:case 11:y=a-b;break; } A.④ B.② C. ③ D. ① 评析: 选项A的错误在于switch语句后面不该加分号; 选项B的错误在于switch语句要求每一个case的常量表达式的值必须互不相同; 选项C 的错误在于变量a 应该用括号括 起来,case 后面应该跟上常量表达式,而不是变量。 本题答案为D 。 18.C 语言源程序名的后缀是______。 选项:A. .c B. .exe C. .obj D..cp 评析:本题的考查点是C 语言源程序名的后缀。 C 语言源程序名的后缀是.c ,对源程序 进行编译后得到一个后缀为.obj 的目标程 序,然后把目标程序进行连接操作,则可得 到一个后缀为.exe 的可执行文件。 故本题答案为B 。 19.有如下程序 #define N 2 #define M N+1 #define NUM 2*M+1 main() { int i; for(i = 1; i <= NUM; i++) printf("%d\n",i); } 该程序中的for 循环执行的次数是______。 选项:A .8 B .6 C .7 D .5 评析: 本题的考查点是对C 语言中宏定义 的理解。 分别将N ,M 的宏定义代入NUM 的表达 式中,可以得到NUM =2*2+1+1=6,所以当常 数NUM 作为for 循环的终止条件时,应当循 环6次。 故本题答案为B 。 20.有以下程序 main() { unsigned char a=2,b=4,c=5,d; d=a|b; d&=c; printf("%d\n",d); } 程序运行后的输出结果是______。 选项:A.4 B.3 C.5 D.6 评析: 本题考查的是逻辑运算。 本题中主要是进行位的逻辑运算。将a 的值转换为二进制为:0000 0010,b 的值转换为二进制为:0000 0100,将a 、b 进行按位或运算(参加计算的两个位只要有一个为1,那么运算结果为1),因此此时d 的二进制为:0000 0110,c 的值转换为二进制为: 0000 0101,接下来将d 和c 进行按位与运算(参加计算的两个位都为1,则结果为1,否则为0),结果为:0000 0100,转换成十 进制数结果为4。 故本题答案选B 。 21.以下程序的输出结果是______。 void fun() { static int a=0; a +=2; printf("%d",a); } main() { int cc; for(cc=1;cc<4;cc++) fun(); printf("\n"); } 答案:246 评析: 循环for(cc=1;cc<4;cc++)被执行了3次。在函数fun 中,由于a 是static 型变量,所以函数第1次调用后,a= 2;第2次调用后,a = 4;第3次调用后,a = 6。 22.以下程序运行后的输出结果是 ______。 main() { int p=30; printf("%d\n",(p/3>0 ? p/10 :p%3)); } 答案:3 评析: 本题的考查点是C 程序设计。 考察的主要知识点是条件表达式。 (p/3>0 ? p/10 :p%3)是一个条件表达式。 条件表达式的一般形式为:表达式1?表达式2:表达式3。条件表达式的执行顺序为:先求解表达式1,若为真则求解表达式2,此时表达式2的值就是整个条件表达式的值。若表达式2的的值为假,则求解表达式3,表达式3的值就是整个条件表达式的值。条件运算符的结合方向为“自右至左”。本题 中p=30,p/3>0为真,所以求解 p/10 的值为3,即为整个表达式的值。 23.以下函数把b字符串连接到a字符串 的后面,并返回a中新字符串的长度。请填空。 strcen(char a[],char b[]) { int num=0,n=0; while(*(a+num)!=______) num++; while(b[n]) {*(a+num)=b[n]; num++;______;} return(num); } 答案:第一空: ‘\0’或0或NULL 第二空:n++或++n或n+=1或n=n+1或n=1+n 评析:第1个循环是为了计算a串的长度,串以NULL结束,所以第1个空应填'\0'或0或NULL;第2个循环是为了在a串的后面加上b串,num++是为了将a串的下标向前移动,毫无疑问,b串的下标也必须向前移动,所以第2个空必须填n++或与此等功能的其它表达式。 24.下面程序的输出是______。 main() { int arr[10],i,k=0; for(i=0;i<10;i++) arr[i]=i; for(i=1;i<4;i++) k+=arr[i]+i; printf("%d\n",k); } 答案:12 评析:本题的考查点是for循环。 第一个循环 for(i=0;i<10;i++) arr[i]=i; 是将数组元素0至9分别赋值为0到9; 第二个循环 for(i=1;i<4;i++) k+=arr[i]+i; 可以变化成以下形式: for(i=1;i<4;i++) k=arr[i]+i+k; 将数组arr[1]、arr[2]、arr[3]的各个值计算可以得到k的最终值为12。 25.下列程序段的输出结果是______。 main() { char b[]="Hello,you"; b[5]=0; printf("%s\n",b); } 答案:Hello 评析:字符串中,数值0或符号'\0'表示字符串的结束。本题中,b[5]被赋了0值,表明字符串b的第六个字符就是结束标志。因此,只输出前五个字符,即Hello。26.以下程序的功能是:输出a、b、c三个变量中的最小值,请填空。 #include main() { int a,b,c,t1,t2; scanf("%d%d%d",&a,&b,&c); t1=a t2=c printf("%d\n",t2); } 答案:第一空:a:b 第二空:c:t1 评析:本题的考查点是条件运算。 通过题意及输出语句可知,t2用来存放a,b,c三个变量中的最小值。程序首先通过条件运算符比较变量a和b,使得其中小的那个值赋值给变量t1;然后再通过变量c 与t1进行比较,将小的值赋给变量t2,从而求得a,b,c三个变量中最小的值。条件运算符的一般形式为: 表达式1?表达式2:表达式3 条件运算符的执行顺序:先求解表达式1,若为非0(真)则求解表达式2,此时表达式2的值就作为整个条件表达式的值。若表达式1的值为0(假),则求解表达式3,表达式3的值就是整个条件表达式的值。由于t1存放是a,b中较小的数,所以当a 的值,故本题第一空填"a:b",同理本题第二空填"c:t1"。 27.下面程序的运行结果是:______。 #define N 10 #define s(x) x*x #define f(x) (x*x) main() {int i1,i2; i1=1000/s(N);i2=1000/f(N); printf("%d %d\n",i1,i2); } 答案:1000 10 评析: 本题的考查点是宏定义。 根据宏定义,变量i1的值为 1000/10*10=1000,变量i2的值为 1000/(10*10)=10。 故本题答案为:1000和10。 28.设有定义:float x=123.4567;,则执行以下语句后的输出结果是______。 printf("%f\n"(int)(x*100+0.5)/100.0); 答案:123.460000 评析:本题考查的是表达式的运算。 输出语句的表达式: (int)(x*100+0.5)/100.0是指先运算表达式中的"x*100+0.5",然后将其结果强制转换为int型,即: (int)(123.4567*100+0.5)=(int)12346.17 =12346,接下来进行"/100.0"的运算即:12346/100.0=123.46,原因是除运算是双目运算,当一边是整型数,一边是实型数时,系统自动将整型转换为实型数,然后进行运算,又因为最后的的输出格式是float类型的实数,所以结果为123.460000。 29.以下程序运行后的输出结果是 ______。 main() {int x=15; while(x>10&&x<50) {x++; if(x/3){x++;break;} else continue; } printf("%d\n",x); } 答案:17 评析:本题的考查点是while循环语句。 当x=15时,while条件为真,执行x++;,这时x的值为16,if条件为真,执行x++;后跳出循环体,此时x的值为17。 故本题答案为:17。 30.若输入字符串:abcde↙,则以下while 循环体将执行______次。 while( (ch=getchar())=='e')printf("*" ); 答案:0或零 评析:函数getchar()是从键盘得到用户输入的一个字符。用户输入的第1个字符是a,不管后面输入的是什么,ch的值都是'a',因此条件(ch=getchar())=='e'为假,这个循环不会被执行。 31.有以下程序段 char ch; int k; ch='a'; k=12; printf("%c,%d,",ch,ch,k); printf("k=%d\n",k); 已知字符a的ASCII十进制代码为97,则执行上述程序段后输出结果是______。 选项: A 因变量类型与格式描述符的类型不匹配 输出无定值 B a,97,k=12 C a,97,12k=12 D 输出项与格式描述符个数不符,输出为零值或不定值 评析: 本题的考查点是数据的输入与输出,输入输出函数的调用。printf函数的参数包括格式控制和输出列表,本题的第一个printf格式控制符"%c,%d"是指输出一个字符型数据和一个整型数据(C语言规定,不管格式符的 个数与输出变量的个数是否相等,则均按格式符的个数输出,如果格式符的个数小于输出变量的个数,则按自左至右的顺序,多余的变量值不输出,若格式符的个数大于输出变量的个数,则多余格式符则由程序自动输出任意值),由于字符a的ASCII码为97,所以第一个printf输出"a,97,";第二个 printf用于输出整型变量k的值,即"k=12",所以本题程序输出的结果是"a,97, k=12"。 32.有以下定义语句double a,b;int w; long c; 若各变量已正确赋值,则下列选项中正确的表达式是______。 选项: A a=a+b=b++ B (c+w)%(int)a C w%((int)a+b) D w=a==b; 评析: 本题考查的是表达式的赋值。选项A不可以连续赋值;选项B中类型不匹配,因为“%”两边表达式值的类型必需为整型;选项D的后面不能加“;”,因为题目要求的是正确的表达式,而表达式后面不能有“;”,只有语句后面才带“;”。 33.以下不合法的数值常量是______。 选项: A le1 B 8.0E0.5 C 0xabcd D 011 评析: 本题考查的是数值常量的定义。 数值常量区分为不同的类型,如12、0、-3为整型常量,4.6、-1.23为实型常量, 'a','A'为字符常量。实数常量有两种表示形式:十进制小数形式和指数形式。用指数形式表示必须注意字母e(或E)之前必须有 数字,且e(或E)后面的指数必须为整数。如:e3、7e3.5、8.0E0.5都是不合法的。34.有如下程序:main() { int n[5] = {0,0,0},i,k = 2; for(i = 0; i < k; i++) n[i] = n[i] + 1; printf("%d\n",n[k]); } 该程序的输出结果是______。 选项: A 1 B 2 C 不确定的值 D 0 评析: 由代码可知,题中的for循环只执行2次(i = 0和1),所以只对a[0]和a[1]重新赋了值,而a[2]的值并没有变,仍为0。 35.以下函数的功能是:通过键盘输入数 据,为数组中的所有元素赋值。 #define N 10 void arrin(int x[N]) { int i=0; while(i scanf("%d",______); } 在下划线处应填入的是______。 选项: A x+(i++) B &x[i+1] C x+I D&x[++i] 评析: 本题的考查点是不同类型数据的输入输出。 使用scanf()函数可以输入任何类型的多个数据,一般形式为:scanf(格式控制,地址表列)。C语言规定,数组名代表数组的首地址,也就是第一个元素的地址,由于该题要求对数组中所有元素赋值,所以应该包含一个循环变量自加的过程,选项A、B明显不正确;对于选项D,++i是先自加后使用i,因此x[0]没有赋值,选项D也不符合题目要求。 36.有以下程序 main(int argc,char *argv[]) {int n=0,i; for(i=1;i n=n*10+*argv[i]-'0'; printf("%d\n",n); } 编译连接后生成可执行文件tt.exe。若运行时输入以下命令行 tt 12 345 678 程序运行后的输出结果是______。 选项: A 12345678 B 12345 C 12 D 136 评析: 本题考查的是带参数的main()函数。main()函数可以带参数,并且参数只能有两个,第1个参数(argc)类型为整型,用来记下命令行的参数个数,第2个参数(argv)为一个字符型指针数组,其各个元素用来记下命令行各参数字符串的首地址。题目中argc的值为4,循环中依次求出argv[1]、argv[2]、argv[3]指向的字符串("12"、"345"、"678")首字符。其中*argv[i]用于指向求出的字符串的首地址的值,即分别为:1、3、6;n=n*10+*argv[i]-'0';语句用于连接各字符串首字符,所以结果为136。 37.在函数调用过程中,如果函数funA调 用了函数 funB,函数funB又调用了函数funA,则______。 选项: A 称为函数的间接递归调用 B 称为函数的直接递归调用 C 称为函数的循环调用 D C语言中不允 许这样的递归调用 评析: 本题考的是函数的递归调用。在调用一个函数的过程中又出现直接或间接地调用该函 数本身,称为函数的递归调用;在调用f1函数过程中要调用f2函数,而在调用f2函数过程中又要调用f1函数是间接调用,所以本题是函数的间接递归调用。 38.设变量x和y均已正确定义并赋值。以 下if语句中,在编译时将产生错误信息的是______。 选项: A if(x++); B if(x>y && y!=0); C if(y<0) {;} else x++; Dif(x>0) x-- else y++; 39.以下程序的输出结果是______。 main() { int a[4][4]={{1,3,5},{2,4,6},{3,5,7}}; printf("%d%d%d%d\n",a[0][3],a[1][2],a [2][1],a[3][0]); } 选项: A 0650 B 输出值不定 C 5430 D 1470 40.若x是int型变量,且有下面的程序片 段 for(x=3;x<6;x++) printf((x%2)?("**%d"):("##%d\n"),x); 上面程序片段的输出结果是______。 ① **3 ② ##3 ③ ##3 ④ **3##4 ##4 **4 **4##5 **5 **5 ##5 选项: A 4 B 2 C 3 D 1 评析; 本题的考查点是条件运算符。这种条件表达 式的一般形式为:表达式1?表达式2:表达式 3,条件运算符的执行顺序为:先求解表达 式1,若非0则求解表达式2,此时表达式2的 值就是整个条件表达式的值,若表达式1的 值为0,则求解表达式3,此时表达式3的值 就是整个条件表达式的值。 41.设有 static char str[]="Beijing"; 则执行 printf("%d\n",strlen(strcpy(str,"Chin a") ) ); 后的输出结果为______。 选项: A 12 B 7 C 5 D 14 评析: 本题的考查点是求字符串的长度。在执行printf()函数前,数组str 的长度是7,但是使用strcpy()函数将新的值赋给str 后,strlen()函数返回的应当是现在的str 字符串的字符个数,即是5。 42.若有定义语句:int a[2][3],*p[3];,则以下语句正确的是______。 选项: A p[0]=a; B p[0]=&a[1][2]; C p[1]=&a; D p=a; 评析: 本题考查的数组及指针的定义。本题定义了一个二维数组a 和一个指针数组p 。选项A 中变量p 是一个数组,它是一个地址常量,不能放在等号的左边,所以选项A 错误;选项B 中,a 是一个指向int[]的地址常量,p[0]是一个int 型地址,所以不能将a 赋值给p[0],故选项B 错误;选项D 中将一个二维数组地址赋值给一个整型指针,是非法的。 43.设int a=12,则执行完语句a+=a-=a*a 后,a 的值是______。 选项: A 144 B 264 C 552 D -264 评析: 本题的考查点是赋值表达式的求解。 第一步:a*a=144 ;(此时a=12) 第二步:a-=144相当于a=a-144,a=a-144=-132; (此时a=-132) 第三步:a+=a 相当于a=a+a ,a=a+a=-264; 所以该表达式最后的值应当为-264。 44.假定 w 、x 、y 、z 、m 均为int 型变量,有如下程序段: w=1;x=2;y=3;z=4 m=(w A 2 B 3 C 4 D 1 评析: 本题考查C 语言的条件运算符。C 语言中条件运算符的表达式为:表达式?数1:数2 当表达式为非零时条件运算符的表达式的值为数1,否则为数2。 45.以下结构体类型说明和变量定义中正 确的是______。 选项: A typedef struct REC; {int n=0; char c= 'A';}t1,t2; B struct REC; {int n; char c;}; REC t1,t2; C typedef struct {int n; char c;} REC; REC t1,t2; D struct {int n; char c;} REC; REC t1,t2; 评析; 本题的考查点是结构体类型变量的定义。 定义一个结构体类型的变量,可采用三种方法: 1)先声明结构体类型再定义变量名: struct 结构体名 {成员表列}; 类型名 成员名 2)在声明类型的同时定义变量: struct 结构体名 {成员表列 }变量名表列; 3)直接定义结构类型变量,即不出现结构体名: struct {成员表列 }变量名表列; 对照以上格式,选项B 、C 、D 均不符合结构体类型说明和变量定义,而选项A 是用typedef 自定义了一个REC 类型,它代表了上面指定的一个结构体类型,并且将变量t1、t2定义成了REC 类型。 46.以下程序的输出结果是______。 #include #include main() { int a=1,b=4,c=2; float x=10.5,y=4.0,z; z=(a+b)/c+sqrt((double)y)*1.2/c+x; printf("%f\n",z); } 选项: A 15.400000 B 14.000000 C 13.700000 D 14.900000 评析: 本题的考查点是sqrt()函数的应用。 函数sqrt(x)是一个标准的数学函数,用于求x的二次方根,知道这一点以后就好做了,将各变量的值带入程序求解即可,另外,程序中的(double)是强制类型转换,将原来为float型的y强制转换成double型变量。 47.有以下程序 main() { int c; while((c=getchar() )!='\n') { switch(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; } } } 从第一列开始输入以下数据,↙代表一个回车符。 2473↙ 程序的输出结果是______。 选项:A 6688766 B 668966 C 66778777 D 668977 评析; 本题的考查点是switch()语句。 getchar()函数是从键盘接受一个字符 输入;当用户键入的字符不是回车符时,会 进入一个多分支选择语句,根据表达式 c-'2'的值进行分支选择;putchar()是在屏 幕上打印一个字符,最后的结果应当为 668977。 48.C语言源程序名的后缀是______。 选项: A .obj B . C C.exe D.cp 评析: 本题的考查点是C语言源程序名的后缀。 C语言源程序名的后缀是.c,对源程序 进行编译后得到一个后缀为.obj的目标程 序,然后把目标程序进行连接操作,则可得 到一个后缀为.exe的可执行文件 49:有如下程序 #define N 2 #define M N+1 #define NUM 2*M+1 main() { int i; for(i = 1; i <= NUM; i++) printf("%d\n",i); } 该程序中的for循环执行的次数是______。 选项: A 7 B 6 C 5 D 8 评析: 本题的考查点是对C语言中宏定义的理解。 分别将N,M的宏定义代入NUM的表达式 中,可以得到NUM=2*2+1+1=6,所以当常数 NUM作为for循环的终止条件时,应当循环6 次。 50:有以下程序 main() { unsigned char a=2,b=4,c=5,d; d=a|b; d&=c; printf("%d\n",d); } 程序运行后的输出结果是______。 选项: A 5 B 4 C 3 D 6 评析: 本题考查的是逻辑运算。 本题中主要是进行位的逻辑运算。将a 的值转换为二进制为:0000 0010,b的值转换为二进制为:0000 0100,将a、b进行按位或运算(参加计算的两个位只要有一个为1,那么运算结果为1),因此此时d的二进制为:0000 0110,c的值转换为二进制为:0000 0101,接下来将d和c进行按位与运算(参加计算的两个位都为1,则结果为1,否则为0),结果为:0000 0100,转换成十进制数结果为4。 51:以下程序运行后的输出结果是 ______。 int f(int a[],int n) { if(n>=1) return f(a,n-1)+a[n-1]; else return 0; } main() { int aa[5]={1,2,3,4,5},s; s=f(aa,5); printf("%d\n",s); } 评析: 本题考查的是递归调用。本题通过递归调用实现了数组aa各元素之和,即 a[4]+a[3]+a[2]+a[1]+a[0]=15。 52:若有以下程序 main() { char a; a='H'-'A'+'0'; printf("%c\n",a); } 执行后输出结果是______。 评析: 本题的考查点是字符数据在内存中的存储形式。将一个字符常量放到一个字符变量中,实际上并不是把该字符本身放到内存单元中去,而是将该字符相应的ASCII代码放到存储单元中,由此可以看出字符数据在内存中是以ASCII码存储的。字符'A'的ASCII 码值为65,'H'的ASCII码值为72,'\0'是一个ASCII码值为0的字符,其作用是实现整型和字符型的转换。"%c"是用于输出字符的格式符,所以最后打印输出7。 故本题答案为:7。 53:以下程序运行后的输出结果是 ______。 main() { int a[4][4]={{1,2,3,4},{5,6,7,8},{11,12,1 3,14},{15,16,17,18}}; int i=0,j=0,s=0; while(i++<4) { if(i==2||i==4) continue; j=0; do{ s+= a[i][j]; j++; } while(j<4); } printf("%d\n",s); } 评析: 本题考查的是循环的嵌套。 解题过程: (1)当i=0时执行while 1)i<4,i=1 2)因为i=1,所以不执行continue 3)j赋值0 4)执行do while ①s=0+a[1][0]=5,j=1,因为j<4,所以继续循环 ②s=5+a[1][1]=5+6=11,j=2,因为j<4,所以继续循环 ③s=11+a[1][2]=11+7=18,j=3,因为j<4,所以继续循环 ④s=18+a[1][3]=18+8,j=26,因为j=4,所以终止循环 (2)当i=1时,i<4执行while,i=2,因为i=2,所以执行continue,结束本次while循环 (3)当i=2时,i<4执行while,i=3 1)因为i=3,所以不执行continue 2)j赋值0 3)执行do while ①s=26 ②s=26+a[3][0]=26+15=41,j=1, 因为j<4,所以继续循环 ③s=41+a[3][1]=41+16=57,j=2, 因为j<4,所以继续循环 ④s=57+a[3][2]=57+17=74,j=3, 因为j<4,所以继续循环 ⑤s=74+a[3][3]=74+18=92,j=4, 因为j=4,所以终止循环 (4)i=3时,i<4执行while,i=4因为i=4,所以执行continue,结束本次循环 (5)当i=4时,i=4结束while循环 54:下面程序的输出是______。 main() { int arr[10],i,k=0; for(i=0;i<10;i++) arr[i]=i; for(i=1;i<4;i++) k+=arr[i]+i; printf("%d\n",k); } 答案:12 55:下列程序段的输出结果是______。 main() { char b[]="Hello,you"; b[5]=0; printf("%s\n",b); } 评析: 字符串中,数值0或符号'\0'表示字符串的结束。本题中,b[5]被赋了0值,表明字符串b的第六个字符就是结束标志。因此,只输出前五个字符,即Hello。 56:语句;X++;、++X;、X=X+1;、X=1+X;, 执行后都使变量X中的值增1,请写出一条同一功能的赋值语句(不得与列举的相同)__ ___。 评析:本题主要考查考生对C语言的语法的掌握。 在C语言中使变量增1的方法有:自增运算符与赋值语句。其中自增运算符有前置与后置方式,赋值语句也有两种类型。 本题中的主要增1方式有:X++;、++X;、X=X+1;、X=1+X;、X+=1;。 57:以下程序运行后的输出结果是 ______。 #define S(x) 4*x*x+1 main() { int i=6,j=8; printf("%d\n",S(i+j)); } 评析: 本题考查的是宏定义。 带参数的宏定义是按#define命令行中指定的字符串从左到右进行转换。本题中替换的式子为:4*i+j*i+j+1,代入i,j的值得81。 58:设变量已正确定义为整型,则表达式n=i=2,++i,i++的值为______。 评析: 本题的考查点是表达式类型和求值规则。逗号表达式的一般形式为:表达式1,表达式2,表达式3……表达式n,它的值为表达式n的值。由于赋值运算符的优先级高于逗号运算符,所以本题先进行赋值表达式的的运算,i=2,n=i,所以n的值为2,接着运行++i表达式的值,先将i的值加1,2+1=3,再将值赋给i,此时i的值为3,最后运行i++表达式,先输出i的值为3,此值就是逗号表达式的值,再将i的值加1,此时i的值为4。59:有以下程序 main() { int n=0,m=1,x=2; if(!n) x-=1; if(m) x-=2; if(x) x-=3; printf("%d\n",x); } 执行后输出的结果是______ 评析: 因为n=0,所以!n为真,执行x-=1;即x=x-1, 因为x=2,所以x=x-1=2-1=1; m=1,为真,执行x-=2;即x=x-2,由上得出x=1,所以x=x-2=1-2=-1; x=-1,为真,执行x-=3;即x=x-3,由上得出x=-1,所以x=x-3=-1-3=-4。 60:若输入字符串:abcde↙,则以下while 循环体将执行______次。 while( (ch=getchar())=='e')printf("*" ); 评析: 函数getchar()是从键盘得到用户输入的 一个字符。用户输入的第1个字符是a,不管后面输入的是什么,ch的值都是'a',因此条件(ch=getchar())=='e'为假,这个循环不会被执行。 61:以下程序的输出结果是_____。 struct HAR { int x,y;struct HAR *p;} h[2]; main() { h[0].x=1;h[0].y=2; h[1].x=3;h[1].y=4; h[0].p=&h[1];h[1].p=h; printf("%d%d\n",(h[0].p)->x,(h[1].p)->y) } 答案:32 62:与数学式子3乘以x的n次方/(2x-1) 对应的C语言表达式是____。 A3*x^n/(2*x-1) B3*pow(x,n)*(1/(2*x-1)) C3*x**n/(2*x-1) D3*pow(n,x)/(2*x-1) 答案:B 63:以下选项中合法的字符常量是:____。 A. "B" B. '\010' C. D D. 68 答案:B 64:要求以下程序的功能是计算: s=1+1/2+1/3+…+1/10。 main() { int n; float s; s=1.0; for(n=10;n>1;n--) s=s+1/n; printf("%6.4f\n",s); } 程序运行后输出结果错误,导致错误结果的程序行是______。 答案:s=s+1/n; 65:有以下程序: main() { int x=0,y=5,z=3; while(z-->0&&++x<5) y=y-1; printf("%d,%d,%d\n",x,y,z); } 程序执行后的输出结果是______。 答案:3,2,-1 66:在以下语句中存在语法错误的是 _____ A. char *ss[6]; ss[1]="right?"; B.char ss[][20]={"right?"}; C. char ss[6][20]; ss[1]="right?"; D. char *ss[]={"right?"}; 答案:C 67:以下程序的输出结果是____。 long fun(int n) { long s; if(n==1||n==2) s=2; else s=n-fun(n-1); return s; } main() { printf("%ld\n",fun(3));} 答案:1 68:定义语句:int a=1,b=2,c=3,x;,则 以下选项中各程序段执行后,x的值不为3的是____C__。 A. if (c else if (b else x=3; B. if (a