1、有以下程序
main(){
int a=1,b=2,m=0,n=0,k;
k=(n=b>a)||(m=a<b);
printf("%d,%d\n",k,m);
}
程序运行后的输出结果是______。
A:0,0
B:0,1
C:1,0
D:1,1
答案:C
评析:
本题的考查点是逻辑或运算。
a||b若a,b之一为真,则a||b为真,但如果a为真,则b不用考虑,也就是无需计算,仍为原值。
结合本题,因为b>a为真,即n=1,所以m不用计算仍为原值,且k值为1。
故本题答案为C。
2、有以下程序
main(){
int a;
char c=10;
float f=100.0;
double x;
a=f/=c*=(x=6.5);
printf("%d %d %3.1f %3.1f\n",a,c,f,x);
}
程序运行后的输出结果是______。
A:1 65 1 6.5
B:1 65 1.5 6.5
C:1 65 1.0 6.5
D:2 65 1.5 6.5
答案:B
评析:
本题的考查点是复合的赋值运算符。
在赋值符"="之前加上其它运算符,可以构成复合的运算符。运算方向为自右至左。
本题中先计算c的值,c=c*(x=6.5)=10*6.5=65;
接下来计算f的值,f=f/c=100.0/65=1.5;
最后计算a的值,a=f,因为a为整数,取f的整数部分即为1。故本题答案为B。
3、有以下程序
main()
{int x, y, z;
x=y=1;
z=x++,y++,++y;
printf("%d,%d,%d\n",x, y, z);
}
程序运行后的输出结果是______。
A:2,3,3
B:2,3,2
C:2,3,1
D:2,2,1
答案:C
评析:
本题考查的是C语言的运算规则。
x++:表示在使用x之后,使x的值加1;y++:表示在使用y之后,使y的值加1;++y:表示在使用y之前,使y的值加1。此题中执行z=x++,是将x的值先赋给z,所以z=1,接下来x自行加1,其结果为2;执行y++后,y=2,执行++y后,y=3。 故本题答案为C。
4、设a=5,b=6,c=7,d=8,m=2,n=2,执行
(m=a>b)&&(n=c>d)
后n的值为______。
A:1
B:2
C:3
D:4
答案:B
评析:
本题的考查点是逻辑与运算。
在逻辑表达式的求解中,并不是所有的逻辑运算符都被执行,只是在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符。
本题中,(m=a>b)的值为0,求出整个表达式的值为0,不需执行(n=c>d),所以n仍为2。故本题答案为B。
5、设int a=12,则执行完语句a+=a-=a*a后,a的值是______。
A:552
B:264
C:144
D:-264
答案:D
评析:
本题的考查点是赋值表达式的求解。
第一步: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。故本题答案为D。
6、若有以下程序段
int c1=1 ,c2=2,c3;
c3=1.0/c2*c1;
则执行后,c3中的值是______。
A:0
B:0.5
C:1
D:2
答案:A
评析:
1.0/c2*c1即1.0/2*1的值为0.5,由于c3的类型为整型,所以在表达式赋值时,进行类型的自动转换,将0.5转换为整型0。本题答案为A。
7、已有定义:int x=3,y=4,z=5;,则表达式!(x+y)+z-1&&y+z/2的值是______。
A:6
B:0
C:2
D:1
答案:D
评析:
本题的考查点是运算符的优先级。
在本题中,运算符的优先级分别为:!大于/大于+,-大于&&,即:!(3+4)+5-1&&4+5/2=0+5-1&&4+2=4&&6=1。故本题答案为D。
8、以下正确的字符串常量是______。
// A:"\\\"
// B:'abc'
// C:Olympic Games
// D:" "
// 答案:D
// 评析:
// 本题的考查点是字符串常量。
// 字符串常量是由一对双引号括起的字符序列。例如:"CHINA","C program","$12.5" 等都是合法的字符串常量。
// 选项A中双引号内使用了两个转义符,即后一个双引号也作为字符串的内容了,故此字符串中还缺少用于表示字符串结束的引号,所以选项A的表示法错误;
// 选项B,C均没有用双引号括起来,所以并不是字符串;选项D表示空字符串,是正确的表示法。故本题答案为D。
9、若有下面的说明和定义,则sizeof(struct aa)的值是______。
struct aa
{int r1;double r2;float r3;
union uu{
char u1[5];
long u2[2];
}ua;
}maya;
A:30
B:29
C:24
D:22
答案:D
评析:
本题的考查点是结构体的长度。
sizeof(x)为运算符,它运算的结果是x型的数据结构占用的内存字节数,题目中定义了一个结构体aa,它的长度为其中数据成员所占内存的总和。
int型的变量需要2个字节;double型的变量需要8个字节;float型的变量需要4个字节;题目中结构体aa包含了一个共用体uu,而共用体变量在内存中所占的长度等于最长的成员的长度,而char型的变量需要1个字节,char u1[5]即需要5个字节,long型的变量需要4个字节,long u2[2]即需要8个字节,所以共用体uu需要8个字节的存储空间;因此,sizeof(struct aa)的值应为2+8+4+8=22个字节。
故本题答案为D。
10、若有以下说明和定义
union dt {
int a;char b;double c;
} data;
以下叙述中错误的是______。
A:data的每个成员起始地址都相同
B:变量data所占的内存字节数与成员c所占字节数相等
C:程序段:data.a=5;printf("%f\n",data.c);输出结果为5.000000
D:data可以作为函数的实参
答案:C
评析:
本题考查的是共用体。
union是表示共用体的关键字,说明其内的成员a,b,c共占用同一个内存空间,所以data的每个成员起始地址都相同;共用体变量所占的内存长度等于最长的成员的长度,故变量data所占的内存字节数与成员c所占字节数相等;但由于各成员变量的类型不一致,所以它们的存储方式也不相同,整型占用2个字节的存储空间,double型占用8个字节的存储空间;
另外data可以作为函数的实参,此时data作为一个地址进行地址传送;
执行"data.a=5;printf("%f\n",data.c);"系统不能自动将整型变量转换为浮点型值,printf函数只是将内存中的数据以不同的类型输出,而不能将内存中的整型数据自动转换为等值的浮点数,故C是错误的。
故本题答案为C。
11、设有以下定义
union data{
int d1; float d2;
} demo;
则下面叙述中错误的是______。
A:变量demo与成员d2所占的内存字节数相同
B:变量demo中各成员的地址相同
C:变量demo和各成员的地址相同
D:若给demo.d1赋99后,demo.d2中的值是99.0
答案:D
评析:
本题的考查点是共用体的存储特点。
共用体的存储特点:
(1)同一块内存可以存放不同类型的数据,但在某一时刻只能存放其中的一种;
(2)共用体变量中起作用的成员是最后一次存放的成员,即在存入一个新的成员后原有的成员失去作用,所以选项D的说法是错误的;
(3)共用体变量的地址和它的成员的地址是同一个地址,且各成员的地址也相同,因为共用体成员是共同占用同一段存储空间的,所以选项B,C的说法都正确;
(4)共用体变量不能整体被赋值,也不能给共用体变量赋初值;
(5)共用体所占的内存长度等于最长的成员的长度,所以选项A的说法正确。
故本题答案为D。
12、有以下程序,用于进行编译器大小端模式判断
main(){
union{
char ch[2];
int d;
}s;
s.d=0x4321;
printf("%x,%x\n",s.ch[0],s.ch[1]);
}
在16位编译系统上,程序执行后的输出结果是______。
答案:21,43
评析:
本题考查的是共用体。
int类型变量和字符数组ch共用两个字节的相同的存储单元,通常ch[0]位于低字节,ch[1]位于高字节,所以s.ch[0]=21,s.ch[1]=43。
故本题答案为21,43。
13、设有如下枚举类型定义
enum language {
Basic=3,Assembly=6,Ada=100,COBOL,Fortran
};
枚举量Fortran的值为______。
答案:102
评析:
本题考查的是枚举类型。
这个枚举中共有5个元素,前三个已有明确的赋值,而COBOL和Fortran没有明确的赋值,枚举的语法规定当枚举元素没有赋值时,其值为其前一个元素的值加一,所以COBOL的值为101,故Fortran的值应为102。
故答案为102。
14、下列选项中正确的语句组是______。
// A:char s[8]; s={"Beijing"}
// B:char *s; s={"Beijing"}
// C:char s[8]; s="Beijing"
// D:char *s; s="Beijing"
// 答案:D
// 评析:
// 本题的考查点是字符串的定义和赋初值。
// 选项A.C是对字符数组初始化,可以是逐个字符赋给数组中各元素,也可以对整个字符串赋初值,但必须是字符型(s型),并且C语言规定,只有静态存储(static)数组和外部存储(extern)数组才能初始化。所以选项A.C都不对。应该这样来实现:static char s[ ]="Beijing";选项B.D是想通过字符指针来实现,正确的格式是char *s; s="Beijing"。
// 故本题答案为D。
// 知识点:知识点/知识点/数组的定义和引用/字符串与字符数组
15、在C语言中,函数中变量的隐含存储类别是______。
A:auto
B:static
C:extern
D:无存储类别
答案:A
评析:
本题考查的是函数中变量的存储类别。
函数中变量的存储类别包括auto,static,extern,其中auto为隐含存储类别,static为静态存储类别,register是寄存器存储类别。
故本题答案为A。
16、若程序中定义了以下函数,
double myadd(double a,double b){
return(a+b);
}
并将其放在调用语句之后,则在调用之前应该对函数进行说明,以下选项中错误的说明是______。
A:double myadd(double a, b);
B:double myadd(double,double);
C:double myadd(double b, double a);
D:double myadd(double x, double y);
答案:A
评析:
对函数的"定义"和"说明"不是一回事。"定义"是指对函数功能的确立,包括指定函数名,函数值类型、形参及其类型、函数体等,它是一个完整的、独立的函数单位。
而"说明"则是对已定义的函数的返回值进行类型说明(或称"申明"),它只包括函数名、函数类型、以及一个空的括弧,不包括形参和函数体。
对被调函数进行说明的作用是告诉系统:在本函数中将要用到的某函数是XX类型。也就是说明该函数的返回值的类型,以便在主调函数中按此类型对函数值作相应的处理。
本题选项A中,函数参数列表中,不可以用一类型声明多个变量,即变量b没有被声明,所以出错。
故本题答案为A。
17、有以下程序
int a=1;
int f(int c){
static int a=2;
c=c+1;
return (a++)+c;
}
main(){
int i,k=0;
for(i=0;i<2;i++){
int a=3; k+=f(a);
}
k+=a;
printf("%d\n",k);
}
程序的运行结果是______。
A:14
B:15
C:16
D:17
答案:A
评析:
本题的考查点是变量的作用域和生存期。
本题定义的"int a=1;"中的全局变量a,其作用范围是从定义此变量的位置开始到本源文件结束;
"static int a=2;"中的静态局部变量a的作用范围是其所在的函数f,并对其只赋一次初值,以后每次调用函数时不再重新赋初值,而只是保留上次函数调用结束时的值。
在主函数中,执行第一次for循环,i=1:k=k+f(3),其中f(3)的值为调用函数f后返回的值,即"(a++)+c"的值,由于此时的值为2+4=6,所以第一次for循环结束后,k=6,a=3;i=2:k=6+f(3),f(3)的值同样为"(a++)+c"的值
由于在f函数中a是静态变量,所以第二次调用f函数时a的值为第一次调用f函数结束时的值3,故(a++)+c=3+4,所以第二次for循环结束后,k=6+7,即k的值为13;
for循环执行两次结束后,执行k+=a,由于此时的a的值是全局变量的值,所以k=k+a=13+1=14。故程序运行后的结果为14。
故本题答案为A。
18、在一个C源程序文件中所定义的全局变量,其作用域为______。
A:所在文件的全部范围
B:所在程序的全部范围
C:所在函数的全部范围
D:由具体定义位置和extern说明来决定范围
答案:D
评析:
本题的考查点是全局变量的作用域。
全局变量也称为外部变量,它是在函数外部定义的变量。它不属于哪一个函数,它属于一个源程序文件。其有效范围是从定义变量的位置开始到本源文件结束。
在函数中使用全局变量,一般应作全局变量说明。只有在函数内经过说明的全局变量才能使用。全局变量的说明符为extern。但在一个函数之前定义的全局变量,在该函数内使用可不再加以说明。
故本题答案为D。