1,
在上下文和头文件均正常情况下,以下程序的输出结果是()
int x = 1;
do{
printf("%2d\n",x++);
}while(x--);
A 1
B 无任何输出
C 2
D 陷入死循环
解析 : D,do-while语句, do里面的先无脑执行一次。所以x的值 : 2 1 2 1 2 1,,,
(因为x–是后置,每次while判断语句x的值是2)
2, 定义char dog[]=“wang\0miao”;那么sizeof(dog)与strlen(dog)分别是多少()
A 10,4
B 4,4
C 9,9
D 9,4
解析 : A, sizeof数组名求的是整个数组的字节大小,用双引号括起来的内容,末尾是会多个‘\0’的,而strlen()是遇‘\0’停止,
并且不包含’\0’
3,下列程序的打印结果是()
char p1[15] = "abcd", *p2 = "ABCD", str[50] = "xyz";
strcpy(str + 2, strcat(p1 + 2, p2 + 1));
printf("%s", str);
A xyabcAB
B abcABz
C ABabcz
D xycdBCD
解析 : D, strcat是追加函数,是在目的字符串的末尾\0追加, 并且返回的是目的地址的首地址 !!, 而strcpy是在字符串的首地址追加
所以 strcat(p1 + 2, p2 + 1) —>返回的是p1 + 2的首地址,则 临时字符串为 cdBCD,
strcpy(str + 2, abcdBCD) ,是在首地址追加,不要混乱了, 传参是str + 2,也就是首地址是 &str[2]
所以结果为 xycdBcd
4,下面程序的输出结果是()
#include<iosteam.h>
void main()
{int n[][3] = {10,20,30,40,50,60};int (*p)[3];p=n;cout<<p[0][0]<<","<<*(p[0]+1)<<","<<(*p)[2]<<endl;
}
A 10,30,50
B 10,20,30
C 20,40,60
D 10,30,60
解析 : B, int (*p) [3] , p是指针,指向一个数组,该数组有3个元素。 而n是二维数组,数组名表示首元素的地址,也就是第一行的地址
n == &n[0],
p[0][0] 输出10,
而p[0] 是第一行元素的第一个地址, +1就到了第二个, 解引用访问第二个, 也就是20
(*p)[2],*p解引用拿到第一行的地址,然后访问下标2, 也就是30
5,以下说法中正确的是( )
A C++程序中的main()函数必须放在程序的开始部分
B C++程序的入口函数是main函数
C 在C++程序中,要调用的函数必须在main()函数中
解析 : B
有以下程序运行结果为()
#include <iostream>
using namespace std;
char fun(char x, char y)
{if (x < y)return x;return y;
}
int main()
{int a = '1', b = '1', c = '2';cout << fun(fun(a, b), fun(b, c));return 0;
}
A 运行出错
B 2
C 3
D 1
解析 : D
7.,对于int* pa[5];的描述,以下哪个选项是正确的()
A pa是一个具有5个元素的指针数组,每个元素是一个int类型的指针;
B pa是一个指向数组的指针,所指向的数组是5个int类型的元素;
C pa[5]表示某个数的第5个元素的值;
D pa是一个指向某个数组中第5个元素的指针,该元素是int类型的变量
解析 : A, []的优先级非常高,所以pa先和 [ ]结合, 所以pa是数组, 每个元素是int*
下面两个结构体
struct One
{
double d;
char c;
int i;
}
struct Two
{
char c;
double d;
int i;
}
在#pragma pack(4)和#pragma pack(8)的情况下,结构体的大小分别是()
A 16 24,16 24
B 16 20,16 20
C 16 16,16 24
D 16 16,24 24
解析 : C, 4字节对齐 下 One : 8 + 1 + 3 + 4 = 16 (最后的大小是用过的对齐数的最大值的倍数)
Two : 1 + 3 + 8 + 4 = 16
8字节对齐下 One : 8 + 1 + 3 + 4 = 16
Two : 1 + 7 + 8 + 4 + 4 = 24
9.,下面哪个指针表达式可以用来引用数组元素a[i][j][k][l]()
A (((a+i)+j)+k)+l)
B ((((a+i)+j)+k)+l)
C (((a+i)+j)+k+l)
D ((a+i)+j+k+l)
解析 : B,无脑套娃
10,由多个源文件组成的C程序,经过编辑、预处理、编译、链接等阶段会生成最终的可执行程序。下面哪个
阶段可以发现被调用的函数未定义()
A 预处理
B 编译
C 链接
D 执行
解析 : C
预处理 : 头文件展开, 条件编译, 删除注释,宏替换
编译 : 语法分析, 将代码转换为汇编语言
汇编 : 生成符号表,将汇编语言转换为二进制的机器指令
连接 : 合并符号表,找到函数调用的地址连接起来。
11, 十进制变量i的值为100,那么八进制的变量i的值为()
A 146
B 148
C 144
D 142
解析 : C 144 = 8 ^0* 4 + 8 ^ 1 * 4 + 8 ^2 * 1= 100
12,
执行下面语句后的输出为
int I=1;
if(I<=0)
printf("****\n") ;
else
printf("%%%%\n");
A %%
B ****
C 有语法错,不能正确执行
D %%%%
解析 :A, %%只会输出一个%
13,对于下面的C语言声明描述正确的一项是()
char (*p)[16]
A p是长度为16的字符指针数组
B p是包含16个字符的字符串
C p是指向长度为16的字符数组的指针
D p是长度为16的字符数组
解析 : C,p先和*结合,是指针。然后指向一个数组,每个数组的元素是char
14,数组a的定义语句为“float a[3][4];”,下列()是对数组元素不正确的引用方法
A a[i][j]
B *(a[i]+j)
C ((a+i)+j)
D (a+i4+j)
解析 : D
15, 下面程序的输出结果是__________。
#include < iostream.h>
#define SQR(A) A*A
void main()
{
int x=6,y=3,z=2;
x/=SQR(y+z)/SQR(y+z);
cout< < x< < endl;
}
A 5
B 6
C 1
D 0
解析 : D,宏替换的特质 : 原样替换, x /= y + z * y + z / y + z * y + z = 0
16,当n=5时,下列函数的返回值是()
int foo(int n)
{
if(n<2)
{return n;
}
elsereturn 2*foo(n-1)+foo(n-2);
}
A 5
B 11
C 29
D 10
解析 : C, 递归展开的推导—> f(0) = 0, f(1) = 1, f(2) = 2 * f(1) + f(0) = 2, f(3) = 2 *f(2) + f(1) = 5,
f(4) = 2 * f(3) + f(2) = 10 + 2 = 12 , f(5) = 2 * f4 + f3 = 24 + 5 = 29
17, 以下对C语言的”指针“描述不正确的是()
32位系统下任何类型指针的长度都是4个字节
B 指针的数据类型声明的是指针实际指向内容的数据类型
C 野指针是指向未分配或者已释放的内存地址
D 当使用free释放掉一个指针内容后,指针变量的值被置为NUll
解析 :D,是需要手动置为NUll的,不是自动的
- 数组定义为”int a[4][5];”, 引用”*(a+1)+2″表示()(从第0行开始)
A a[1][0]+2
B a数组第1行第2列元素的地址
C a[0][1]+2
D a数组第1行第2列元素的值
解析 : B
18,
struct A{
long a1;
short a2;
int a3;
int *a4;
};
请问在64位编译器下用sizeof(struct A)计算出的大小是多少()
A 24
B 28
C 16
D 18
解析 A , 4 + 2 + 2 + 4 + 4 + 8 = 24, 64位的指针是8个字节
19
#include
using namespace std;
int f(int n)
{
if (n==1)
return 1;
else
return (f(n-1)+nnn);
}
int main()
{
int s=f(3);
cout<<s<<endl;
return 0;
}
运行结果是 ()
A 8
B 9
C 27
D 36
解析 : D, f(1) =1 , f(2) = f(1) + 2 * 2 * 2= 9, f3 = f(2) + 3 * 3 * 3 = 36