C++刷题--选择题3

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;
}
else
   return 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的,不是自动的

  1. 数组定义为”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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

通过全部用例

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值