1、若有定义int a[8];,则以下表达式中不能代表数组元素a[1]的地址的是()
A、&a[0]+1
B、&a[1]
C、&a[0]++
D、a+1
答案:C
解析:C选项中&a[0]是一个地址常量,对地址常量的赋值操作是不合法的,错误。
2、 以下函数值的类型是:
fun ( float x )
{ float y;
y= 3*x-4;
return y;
}
A、int
B、不确定
C、void
D、float
答案:A
解析:在C语言中,返回类型不写默认为int类型,如果return的类型与函数类型不符,以函数类型为准,所以选择选项A。
3、执行以下语句后b的值为:
int a=5,b=6,w=1,x=2,y=3,z=4;
(a=w>x)&&(b=y>z);
A、16
B、0
C、1
D、6
答案:D
解析:根据运算符的优先级,首先计算第一个括号中的内容,又 > 的优先级大于 = ,故先判断 w > x ,为假则 a = 0,第一个式子返回值为零。根据短路法则,第二个式子不会执行,所以 b = 6 不变,选择选项D。
4、有函数定义:
1
2
void
test(
int
a){}
void
test(
float
a){}
则以下调用错误的是:
A、test(1);
B、test(‘c’);
C、test(2+’d’);
D、test(0.5);
答案:D
解析:D选项中,test(0.5)参数默认为double类型,调用函数时既可以匹配int类型也可以匹配float类型,造成类型模糊,改为test(0.5f)可以解决问题,选择选项D。
5、 下面代码的输出结果是?
1
2
3
4
5
6
7
#include <stdio.h>
int
main() {
int
z, x = 5, y = -10, a = 4, b = 2;
z = x++ - --y * b / a;
printf
(
"%d\n"
, z);
return
0;
}
A、5
B、6
C、10
D、11
E、12
答案:C
解析:本题考查运算符的优先级。自增自减的优先级最高,首先进行x++和--y,++为后++,先取x的值为5,然后x自加为6,进行--y,y变为-11。式子可以化为 z = 5 - -11 * 2 / 4,现在式子中*和/的优先级最高,结合顺序从左往右,得到结果为-5.5,舍去小数位得-5。所以最终z = 5 - (- 5) = 10,选择选项C。
6、 若变量a是int类型,并执行了语句a=’A'+1.6;,则正确的叙述是()
A、a的值是字符C
B、a的值是浮点型
C、不允许字符型和浮点型相加
D、a的值是字符’A’的ASCⅡ值加上1
答案:D
解析:等式右边'A'转为对应的ASCII码与1.6进行运算,运算后得到的结果为double类型,将这个值赋给一个int型的变量,相当于进行一次强制转换,会丢失精度变为98。所以选择选项D。
7、 在上下文和头文件正常的情况下,以下C语言指令:
1
2
3
int a[
5
] = {
1
,
3
,
5
,
7
,
9
};
int *p = (int *)(&a+
1
);
printf(
"%d,%d"
,*(a+
1
),*(p
-1
));
运行结果是什么?
A、2,1
B、3,1
C、3,9
D、运行时崩溃
答案:C
解析:代码的第二行中,对&a相当于升维度,变成一个行指针,加一之后指向下一行的首地址。所以指针*(p-1)实际上是指向数组a最后一个元素的,*(a+1)等价于a[1],故选择选项C。
8、有以下一段代码
1
2
3
4
5
6
7
8
9
#include <stdio.h>
char
* fun() {
char
a[] =
"hello world"
;
return
a + 6;
}
int
main() {
printf
(
"%s"
, fun());
return
0;
}
请问程序最后输出结果是()
A、world
B、hello world
C、结果未知或者程序崩溃
D、程序崩溃
答案:C
解析:被调函数中定义的数组存放在栈区,当函数结束后,空间会被释放,因此返回的地址是一个无效地址,所以会导致结果未知或者程序崩溃,选择选项C。
9、 下列C程序执行后c输出结果为( )(32位)
1
2
3
4
5
6
7
8
9
#include<stdio.h>
#include<stdlib.h>
void
main()
{
int
a = -3;
unsigned
int
b = 2;
long
c = a + b;
printf
(
"%ld\n"
, c);
}
A、-1
B、4294967295
C、0x7FFFFFFF
D、0xFFFFFFFF
答案:A
解析:无符号整数与有符号整数进行运算结果为无符号整数,-1在计算机中以补码的形式存储,为0xFFFFFFFF。输出时是以十进制数形式输出,那么就还要进行取反加一的操作,找到0xFFFFFFFF是哪个数的补码,所以最后的输出结果为-1,选择选项A。
10、已有如下定义和输入语句,若要求a1、a2,c1、c2的值分别为10、20、A和B,
当从第一列开始输入数据时,正确的数据输入方式是()
1
2
int
a1,a2;
char
c1,c2;
scanf
(
"%d%c%d%c"
,&a1,&c1,&a2,&c2);
A、10A□20□B↙
B、10□A□20□B↙
C、10A20B↙
D、10A20□B↙
答案:C
解析:考查scanf输入的结束条件:空格、tab、回车、非法字符,当输入整数后,按空格会结束整数的输入,但空格会留在缓冲区中。当继续读入字符时,会直接将空格读入,造成错误,所以输入这四个数时不要在中间输入空格,选择选项C。