全国高校计算机能力挑战赛区域赛2019C++选择题题解

2019

1.下列选项中错误的是()。

A.数组元素的地址计算与数组的存储方式有关

B.类的const成员函数不能修改类的成员变量

C.用const常量代替宏定义可以让编译器进行安全性检查

D.函数可以同时返回2个以上的值

解析:

本题选D,函数通常只能直接返回一个值,函数设计初衷是返回单一的结果

A:数组存储方式分为行优先和列优先,所以数组的地址计算和数组的存储方式有关。

B:类的const成员函数不能修改类的成员变量

C:effective c++中曾指出过,尽量用const 定义常量,来替换宏定义。const 替换 宏定义后,编译时能进行类型检查,一旦出错后,比宏定义更方便调试。

2.下列选项中错误的是()。

A.用const常量代替宏定义可以让编译器进行安全性检查

B.指针和引用都可以在定义后任意的改变指向

C.变量可以使用引用机制,对象也可以使用引用机制

D.不能空引用,但是可以有空指针

解析:

本题选B,引用一旦被初始化为指向一个对象,它就不能被改变成另一个对象的引用;而指针在任何时候都可以改变为指向另一个对象。给引用赋值并不是改变它和原始对象之间的关系。

A:effective c++中曾指出过,尽量用const 定义常量,来替换宏定义。const 替换 宏定义后,编译时能进行类型检查,一旦出错后,比宏定义更方便调试。

C:变量可以使用引用机制,对象也可以使用引用机制

D:不能空引用,但是可以有空指针

3.下列选项中正确的是()

A:排序的稳定性是指排序算法中的比较次数保持不变,且算法能够终止

B:折半查找法适用于有序单链表

C:主函数 main 中定义的变量在整个文件或程序中有效

D:由&&构成的逻辑表达式与由||构成的逻辑表达式都有"短路"现象

解析:

本题选D,这题我们之前再C语言讲过,很简单,比如式子:1<2 || 2>3,当判断1<2为真,整个式子为真,就不用再看||后面的部分了,这就是短路。同样式子:1>2 && 2<3,1>2 为假,整个式子为假,也不用再看后面的了

A:排序的稳定性是指相同元素在排序后相对位置保持不变。算法能够终止则意味着该算法在有限步骤内完成,并给出确定的结果。

B:有序顺序表顺序存储地址是连续的,有序的单链表地址随机的,只是数据元素是有序的,折半查找主要通过的是地址下标来查找的,因此有序单链表不能用折半查找来得到数据

C:主函数中定义的变量也只在主函数中有效,并不因为在主函数中定义而在整个文件或程序中有效。

4.下列选项中错误的是()。

A.逻辑"非"(即运算符!)的运算级别是最低的

B.不同函数中,可以使用相同名字的变量

C.派生关系中,基类的析构函数可以声明为虚函数

D.在一个函数内部,可以在复合语句中定义变量,这些变量只在复合语句中有效

解析:

本题选A,本题考的是运算符优先级,大家可以自行百度

B:不同函数中,可以使用相同名字的变量,考的是作用域

C:派生关系中,基类的析构函数可以声明为虚函数,但是构造不行。不懂的可以去看看我们之前讨论过的继承

D:在一个函数内部,可以在复合语句中定义变量,这些变量只在复合语句中有效,我们可以娶个例子:一个函数内部可以有多个复合语句。

cpp 复制代码
void main(void)
{	// 复合语句1

	{	// 复合语句2

		int a = 10;

	}

	printf("%d\n",a);

}
```
编译后报错:[Error] 'a' undeclared (first use in this function)(变量a未声明)
这说明在复合语句(代码块)中定义的变量,不可以在复合语句之外使用。

5.下列关于C++文件打开模式描述错误的是()。

A:ios::app|ios::out,如果没有文件则创建文件,如果有文件,则在文件尾追加

B:ios::ate|ios::out打开,如果没有文件则创建文件,如果有文件,则清空文件。

C:以ios::ate|ios::in打开,如果没有文件则创建文件;如果有文件,那么定位到文件尾

D:ios_base::out|ios_base::trunc,打开以写入,如果已经存在,则删除其中原有的内容

解析:

本题选择C,以ios::ate|ios::in打开,如果没有文件,那么打开失败;如果有文件,那么定位到文件尾,并可以写文件,但是不能读文件

其他的是对的,题解思路来源ofstream之ios::ate,ios::app,ios::in,ios::out-CSDN博客

感谢作者

6.下列关于C++文件打开模式描述,错误的是()。

A:ios_base::in,打开以读取

B:ios_base::out|ios_base::trunc,打开以写入,如果已经存在,则删除其中原有的内容

C:ios_base::out|ios_base::app,打开以写入,只追加

D:ios_base::out|ios_base::ate,打开以写入,在文件的末尾写入

解析:

本题选Dios_base::out | ios_base::ate的效果是将文件指针定位到文件末尾,并允许输出操作

7.C++关于文件操作中的状态标识符验证的描述,错误的是()。

A:bad() 当文件读写过程中出错时返回true

B:fail()当文件读写出错或者输入格式出错时返回true

C:eof() 当读文件到达文件末尾时返回false

D:good()在没有发生任何错误的时候返回true

解析:

本题选C。在 VS2022 中,可以使用 std::ifstream 类的 eof() 函数来判断是否已经读取到文件末尾。 该函数返回 true 表示已经读取到文件末尾,返回 false 表示还未读取到文件末尾。

8.下列关于C++使用open函数打开文件的方式描述错误的是()。

A:ios::in为输入而打开文件

B:ios::out为输出而打开文件

C:ios::binary以二进制方式打开文件

D:ios::trunc如果文件已存在则追加到文件尾

解析:

本题选D,ios::trunc当你想要打开一个文件并删除其内容时,可以使用这个标志。如果文件已经存在,打开文件时其内容会被清空。

9.下列关于C++文件操作输入输出类的描述正确的是()。

A:ofstream是读操作的文件类,继承ostream

B:ifstream是写操作的文件类,继承istream

C:fstream是可同时读写操作的文件类,继承iostream

D:iostream是可同时读写操作的文件类,继承ostream

解析:

本题选C

A:ofstream 类用于向文件写入数据。

B:ifstream是用于从文件中读取数据的输入文件流类。

D:iostream不是继承自ostream的文件类。iostream 是 C++ 标准库中的一个流类,它同时继承了输入流(istream)和输出流(ostream)的功能,用于实现双向的读写操作。这意味着 iostream 类既可以从输入设备(如键盘或文件)读取数据,也可以向输出设备(如屏幕或文件)写入数据。

10.下列数据结构中不属于线性数据结构的是()

A:队列

B:二叉树

C:栈

D:线性表

解析:

选B,二叉树不是线性数据结构

11.栈和队列的共同点不包括()。

A.都是线性数据结构

B.都只允许在端点插入元素

C.都可以从中间删除元素

D.都可以用数组或链表实现

解析:

本题选C,它们都不可以从中间删除元素

12.用两个栈模拟实现一个队列,如果两个栈的容量分别为18和12,那么模拟实现的队列最大容量是()

A.36

B.35

C.24

D.25

解析:

本题选D

记stack1的容量是O,stack2的容量是P,(O>P),将stack1作为存储空间,stack2作为输出的缓冲空间。 入队: 1、将P个元素push到stack1中; 2、再将该P个元素pop到stack2中;(此时出栈的顺序就是队列前P个元素的出栈顺序) 3、将P+1个元素push到stack1中; 出队: 1、先pop stack2所有元素,然后将P个元素pop到stack2中,再将stack1中剩余的元素pop,然后依次pop出stack2中的元素。 最终实现队列的最大容量是2P+1,即本题是2*12+1=25

13.判定一个循环队列(队头指针为front,队尾指针为rear,front指向队头元素的前一个单元,最多容纳n个元素)为满的条件是()。

A.rear == front

B.rear+1 == front

C.(rear+1)%n == front

D.(rear-1)%n == front

解析:

本题选C对于循环队列,即队尾的后一位为队头,因为此处是指针,固选C

14.有初始状态均为空的栈X和队列Y,元素a,b,c,d,e,f,g依次进入栈X,每个元素出栈后立即进入队列Y。如果出队列的顺序为c,f,e,g,d,b,a,则要求栈X的最小容量为()。

A.4

B.5

C.6

D.7

解析:

本题选B,由题意可知,出队列的顺序其实就是出栈的顺序,过程如下:

|-----|-----------|-------|---------------|
| 栈操作 | 栈元素 | 栈元素个数 | 出栈顺序 |
| a进栈 | a | 1 | 无 |
| b进栈 | a,b | 2 | 无 |
| c进栈 | a,b,c | 3 | 无 |
| c出栈 | a,b | 2 | c |
| d进栈 | a,b,d | 3 | c |
| e进栈 | a,b,d,e | 4 | c |
| f进栈 | a,b,d,e,f | 5 | c |
| f出栈 | a,b,d,e | 4 | c,f |
| e出栈 | a,b,d | 3 | c,f,e |
| g进栈 | a,b,d,g | 4 | c,f,e |
| g出栈 | a,b,d | 3 | c,f,e,g |
| d出栈 | a,b | 2 | c,f,e,g,d |
| b出栈 | a | 1 | c,f,e,g,d,b |
| a出栈 | 无 | 0 | c,f,e,g,d,b,a |

栈元素的最大值是5,所以栈的最小值是5

15.有如下程序: int sum(int a, int b){ return a+b; } 以下创建函数指针的语法正确的是()。

A.int (*psum)(int ,int) = sum;

B.int psum = sum;

C.int *psum = sum(int,int);

D.以上都不对

解析:

选A,本题考的是函数指针,函数指针使用方式如下:

cpp 复制代码
int Add(int x, int y)
{
	return x + y;
}
int main()
{
	int(*pf)(int, int) = Add;
 
	printf("%d\n", (*pf)(2, 3));
	return 0;
}

因此选A

16.若有以下定义: int x[4][3]={1,2,3,4,5,6,7,8,9,10,11,12}; int *p=&x[0][0]; 则能够正确表示数组元素x[1][2]的表达式是()。

A.p[1][2]

B.(*p+1)+2

C.p+5

D.p[5]

解析:

本题选D,

首先,我们需要理解数组x[4][3]的内存布局。这是一个二维数组,其中包含4行和3列。

在C语言中,二维数组是按行优先的顺序存储的,即先存储第一行的所有元素,然后是第二行的所有元素,依此类推。因此,数组x[4][3]的内存布局如下:

cpp 复制代码
x[0][0] x[0][1] x[0][2]
x[1][0] x[1][1] x[1][2]
x[2][0] x[2][1] x[2][2]
x[3][0] x[3][1] x[3][2]

指针p被初始化为指向数组的第一个元素x[0][0]

现在,我们要找到表示数组元素x[1][2]的表达式。由于x[1][2]是第二行的第三个元素,它在内存中的位置是从x[0][0]开始的第5个位置(因为前面有两行完整的元素,每行3个,加上当前行的前两个元素)。

因此,正确的表达式应该是从p开始偏移5个位置,即*(p+5)或者等价的p[5]

所以,正确答案是D. p[5]。

17.若有以下程序段: float f[5]; float *pf = &f[0]; 则,以下访问数组的正确方法是()。

A.f[pf]

B.pf[f]

C.*(f++)

D.*(pf++)

解析:

本题选D,

A. f[pf] 是错误的,因为pf是一个指针,不能作为数组的索引。

B. pf[f] 也是错误的,因为f是数组名,代表数组的首地址,不能作为指针的索引。

C. *(f++) 是错误的,因为f是数组名,代表数组的首地址,它是一个常量,不能进行自增操作。

D. *(pf++) 是正确的,因为pf是一个指向数组第一个元素的指针,通过pf++可以移动到下一个元素的位置,然后通过解引用操作符*来访问当前指针所指向的元素。

因此,正确答案是D。

18.若有int a[10]; *p=a; 则p+5表示()。

A.元素a[5]的地址

B.元素a[5]的值

C.元素a[6]的地址

D.元素a[6]的值

解析:

本题选A,在C语言中,int a[10]; 定义了一个整型数组a,它包含10个整数元素。*p=a; 表示指针p指向数组a的第一个元素的地址,即p指向a[0]的地址。p+5 表示指针p向后移动5个int类型元素的位置。由于每个int类型元素占用一定的内存空间(通常是4个字节),p+5实际上是指向a[5]的地址。因此,p+5表示的是元素a[5]的地址。

19.有定义char *s="abcde",则s+2表示()。

A.cde

B.字符'c'

C.字符'c'的地址

D.无确定的输出结果

解析:

本题选C。要理解s+2的含义,首先需要知道s是一个指向字符串的指针。在C语言中,指针运算s+2意味着将指针s向前移动两个字符的位置。由于s最初指向字符串"abcde"的第一个字符'a',所以s+2将指向第三个字符'c'。因此,s+2表示的是字符'c'的地址。

20.若有int *p,a=10;p=&a;则下列关于指针操作的解释正确的是()。

A.(*p)+1是对地址做+1操作

B.*p是对p做乘法操作

C.p+1是对p所指向变量的数值做+1操作

D.p+1是对地址做+1整数单元操作

解析:

在这个问题中,我们需要理解指针和地址操作的基本概念。让我们逐一分析每个选项:

A. (*p)+1 是对地址做+1操作,这个解释是错误的。(*p) 表示取指针 p 所指向的变量的值,然后对这个值加1。这并不是对地址做操作。

B. *p 是对 p 做乘法操作,这个解释也是错误的。*p 表示取指针 p 所指向的变量的值,而不是对 p 做任何操作。

C. p+1 是对 p 所指向变量的数值做+1操作,这个解释也是错误的。p+1 表示将指针 p 向前移动一个整数单元(即增加一个整数的地址),而不是对 p 所指向的变量的值做操作。

D. p+1 是对地址做+1整数单元操作,这个解释是正确的。p+1 表示将指针 p 向前移动一个整数单元,即增加一个整数的地址。

因此,正确的答案是 D。

21.若有int *p,a,b=10;p=&b;则关于操作a=b*(*p)解释正确的是()。

A.第一个*是解引用(间接引用)操作,第二个*是乘法操作

B.第一个*是乘法操作,第二个*是解引用(间接引用)操作

C.两个*都是解引用(间接引用)操作

D.两个*都是乘法操作

解析:

选B

22.下列对双重指针的解释正确的是()。

A.双重指针是指向指针的指针

B.双重指针是同时指向两个不同变量的单个指针

C.双重指针是两个指向同一变量的的指针双重指针是两个指向同一变量的的指针

D.双重指针是指向两个不同变量的一对指针

解析:

正确答案是A. 双重指针是指向指针的指针。

双重指针,也称为二级指针或二重指针,是指一个指针变量,其值是另一个指针变量的地址。换句话说,它指向的是指向某个数据类型的指针。这种指针通常用于需要修改指针本身的场景,例如在函数中改变外部传入的指针变量的值。

23.下面()操作符可用于取指针指向的内容

A.*

B.&

C.->

D..

解析:

在C/C++编程语言中,取指针指向的内容的操作符是*。因此,正确答案是:A. *

24.若定义string *x,y,则下列选项正确的是()。

A.x是一个指向string型变量的指针,y是string类型变量

B.y是一个指向string型变量的指针,x是string类型变量

C.x和y都是指针

D.x类型不确定,y是指针

解析:

我们可以逐步解析这个定义:

  1. string *x 表示 x 是一个指向 string 类型的指针。也就是说,x 是一个指针变量,它可以存储一个 string 对象的地址。
  2. y 紧跟在 *x 之后,没有星号(*),因此 y 不是指针,而是一个普通的 string 类型的变量。

所以,根据上述分析:

  • x 是一个指向 string 型变量的指针。
  • y 是一个普通的 string 类型变量。

因此,正确的选项是: A. x是一个指向string型变量的指针,y是string类型变量

25.下列关于函数的说法中,正确的是()。

A.函数体的最后一条语句必须是return语句

B.编译器会根据函数的返回值类型来区分函数的不同重载形式

C.如果形参与实参类型不一致,在传值时直接传递,不进行类型转换

D.如果函数的返回类型与返回值的类型不一致,会进行类型转换,转换成函数的返回类型

解析:

我们逐步分析每个选项,以确定哪个选项是正确的。

选项 A:函数体的最后一条语句必须是return语句

这个说法不正确。函数体的最后一条语句不一定是 return 语句。函数可以没有返回值(即返回类型为 void),在这种情况下,函数体的最后一条语句可以是任意合法的语句。

选项 B:编译器会根据函数的返回值类型来区分函数的不同重载形式

这个说法不正确。编译器在区分函数的不同重载形式时,主要依据的是参数列表(包括参数的类型和数量),而不是返回值类型。因此,仅凭返回值类型不能区分函数的重载形式。

选项 C:如果形参与实参类型不一致,在传值时直接传递,不进行类型转换

这个说法不正确。在传值调用中,如果形参和实参的类型不一致,编译器会尝试进行隐式类型转换。例如,如果实参是整数,而形参是浮点数,编译器会自动将整数转换为浮点数。

选项 D:如果函数的返回类型与返回值的类型不一致,会进行类型转换,转换成函数的返回类型

这个说法正确。如果函数的返回类型与返回值的类型不一致,编译器会尝试进行隐式类型转换,将返回值转换为函数声明的返回类型。例如,如果函数声明的返回类型是浮点数,而实际返回的值是整数,编译器会自动将整数转换为浮点数。

综上所述,正确的选项是 D。

26.下列关于函数参数描述,错误的是()

A.函数可以有多个参数

B.函数可以没有参数

C.函数的形参可以是指针或者引用类型

D.函数的形参和实参类型必须一致

解析:

我们逐步分析每个选项,以确定哪个选项是错误的。

选项 A:函数可以有多个参数

这个说法是正确的。函数可以定义多个参数,这些参数可以是位置参数、默认参数、可变数量的参数等。

选项 B:函数可以没有参数

这个说法也是正确的。函数可以没有任何参数,即定义一个不带参数的函数。例如,def my_function(): pass 是一个没有参数的函数。

选项 C:函数的形参可以是指针或者引用类型

这个说法在Python中是不准确的。Python中的参数传递机制与C++或Java不同,没有明确的"指针"概念。Python中的变量实际上是对对象的引用,但这种引用行为与C++或Java中的指针不完全相同。在Python中,你可以传递对象引用给函数,但这并不意味着形参是"指针类型"。

选项 D:函数的形参和实参类型必须一致

这个说法是错误的。在Python中,函数的形参和实参之间的类型不需要完全一致。Python是动态类型语言,允许隐式类型转换。例如,如果函数期望一个整数类型的参数,但你传递了一个字符串,Python会尝试将字符串转换为整数(如果可能的话)。

综上所述,错误的选项是 D。

27.下列情况中可以使用函数重载的是()。

A.函数名称不同但参数类型相同

B.函数名称不同且参数类型不同

C.函数名称相同但参数类型不同

D.函数名称相同且参数类型相同

解析:

我们逐步分析每个选项,以确定哪个选项是正确的。

选项 A:函数名称不同但参数类型相同

这个说法不正确。函数重载的关键在于函数名相同,而参数类型或数量不同。如果函数名称不同,即使参数类型相同,也不能称为函数重载。

选项 B:函数名称不同且参数类型不同

这个说法也不正确。同样,函数重载要求函数名相同,而参数类型或数量不同。如果函数名称和参数类型都不同,那就不是重载,而是完全不同的函数。

选项 C:函数名称相同但参数类型不同

这个说法正确。函数重载允许在同一个类中定义多个同名函数,但这些函数的参数类型或数量不同。通过这种方式,可以根据不同的参数类型或数量来调用相应的函数实现。在Python中,虽然没有内置的函数重载机制,但可以通过一些技巧(如默认参数、可变参数)来实现类似的效果。

选项 D:函数名称相同且参数类型相同

这个说法不正确。如果函数名称相同且参数类型也相同,那么就不是函数重载,而是同一个函数的不同调用方式。函数重载要求至少有一个参数的类型或数量不同。

综上所述,正确的选项是 C。

28.以下所列出的各函数首部中,正确的选项是()

A.double func(double a,b)

B.double func(double a,double b)

C.Sub func(a as integer,b as integer)

D.double func(var:Integer;var b:Integer)

解析:

我们逐步分析每个选项,以确定哪个选项是正确的。

选项 A:double func(double a,b)

这个函数首部是不正确的。在C语言中,所有参数必须明确声明其类型,因此参数 b 的类型应该是 double

选项 B:double func(double a,double b)

这个函数首部是正确的。它定义了一个名为 func 的函数,返回类型为 double,并接受两个 double 类型的参数 ab

选项 C:Sub func(a as integer,b as integer)

这个函数首部不符合C语言的语法规范。C语言中不使用 Sub 作为函数的返回类型,且参数类型声明应使用 int 而非 integer。此外,参数类型和变量名之间不应有 as

选项 D:double func(var:Integer;var b:Integer)

这个函数首部也是不正确的。它使用了类似Pascal或某些其他编程语言的语法,而不是C语言的标准语法。C语言中没有 var 关键字用于声明变量类型,且参数之间应使用逗号分隔,而不是分号。

综上所述,正确的选项是 B。

29.下列关于C++函数的叙述中,正确的是()。

A.每个函数都必须返回一个值

B.函数中的形式参数是局部变量

C.在一个函数内的复合语句中定义的变量在本函数范围内有效

D.函数不能自己调用自己

解析:

选项 A:每个函数都必须返回一个值

这个说法不正确。在C语言中,函数可以没有返回值(即返回类型为 void),也可以有返回值。如果函数声明了返回类型但不是 void,则必须在函数体内使用 return 语句返回一个值。但是,如果函数的返回类型是 void,则不需要返回任何值。

选项 B:函数中的形式参数是局部变量

这个说法正确。在C语言中,函数的形式参数(形参)是局部变量,它们只在函数被调用时存在,并在函数执行完毕后销毁。形参的值是从调用函数时传递的实际参数(实参)中获得的。

选项 C:在一个函数内部,可以在复合语句中定义变量,这些变量只在复合语句中有效

在C语言中,函数内部的复合语句(如 {} 中的代码块)内定义的变量是局部变量,它们的作用域仅限于该复合语句内部。这些变量在复合语句结束时失效。

选项 D:函数不能自己调用自己

这个说法不正确。在C语言中,函数可以递归地调用自身,即函数在其定义中调用自身。这种技术称为递归,是编程中常用的一种方法,用于解决分治类型的问题。

30.在C++中,字符串操作函数erase和clear功能的区别是()。

A.clear是删除字符串,erase是添加字符串

B.两者都是删除,但是clear可以指定删除区域

C.两者都是删除,但是erase可以指定删除区域

D.两者都是全部清除字符串,无法指定删除区域

解析:

在C++中,字符串操作函数eraseclear的功能是有区别的。

  • clear函数用于清除整个字符串的内容,即将字符串的长度设为0,但不改变其容量。
  • erase函数用于从字符串中删除指定范围内的字符,可以指定删除的区域。

因此,正确答案是:

C.两者都是删除,但是erase可以指定删除区域

31.C++中,string类的函数capacity功能是()。

A.将内容以字符数组形式返回

B.判断字符串是否为空

C.保留一定量内存以容纳一定数量的字符

D.返回重新分配之前的字符容量

解析:

C++中,string类的函数capacity功能是返回重新分配之前的字符容量

32.string类型获取字符串长度的函数有()

A.size

B.getlength

C.getsize

D.len

解析:

选A

33.C++中,选用函数()判断两个字符串是否相同。

A:strcmp

B:strcap

C:strcat

D:strlen

解析:

选A,在C++中,可以使用strcmp函数来判断两个字符串是否相同。该函数比较两个字符串,如果相等返回0,如果不相等则返回非零值

34.在C++中,为了程序能够使用string类型,需要包含头文件()。

A.〈string〉

B.〈ctime〉

C.〈char〉

D.〈iostream〉

解析:

选B

35.若有定义:int a[2][5]={0};则下列选项中正确的是()。

A.只有元素a[0][0]可得到初值0

B.此说明语句不正确

C.数组a中各元素都能得到初值,但其值不一定为0

D.数组a中每个元素均可得到初值0

解析:

定义一个二维数组并初始化时,如果只给出了部分初始值,那么未明确初始化的元素将被自动初始化为0。具体来说,对于定义 int a[2][5] = {0};,这个初始化语句的含义如下:

  • a[2][5] 表示一个2行5列的二维数组。
  • = {0} 表示用0来初始化整个数组。

当用一个值(这里是0)来初始化整个数组时,这个值会被用来初始化数组的第一个元素,而其余的元素会被自动初始化为0。因此,整个数组 a 的所有元素都会被初始化为0。

现在我们来分析每个选项:

A. 只有元素a[0][0]可得到初值0

  • 这个选项不正确,因为数组中的所有元素都会被初始化为0,不仅仅是 a[0][0]

B. 此说明语句不正确

  • 这个选项不正确,因为 int a[2][5] = {0}; 是一个正确的初始化语句。

C. 数组a中各元素都能得到初值,但其值不一定为0

  • 这个选项不正确,因为数组中的所有元素都会被初始化为0。

D. 数组a中每个元素均可得到初值0

  • 这个选项正确,因为数组中的所有元素都会被初始化为0。

因此,正确的答案是 D。

36.若有说明int a[][2]={{2},{5,4},{8,7}},则a[0][1]的值是()

A.0

B.1

C.5

D.4

解析:

,定义一个二维数组时,如果只给出了部分初始值,那么未明确初始化的元素将被自动初始化为0。具体来说,对于定义 int a[][2] = {``{2}, {5, 4}, {8, 7}};,这个初始化语句的含义如下:

  • a[][2] 表示一个二维数组,每行有2个元素。
  • {``{2}, {5, 4}, {8, 7}} 是给定的初始值列表。

根据C++的规则,这个初始化语句将创建一个3行2列的二维数组,并且未明确初始化的元素将被自动初始化为0。因此,数组 a 的初始化情况如下:

cpp 复制代码
a[0][0] = 2, a[0][1] = 0
a[1][0] = 5, a[1][1] = 4
a[2][0] = 8, a[2][1] = 7

现在我们来分析选项:

A. 0

  • 这个选项正确,因为 a[0][1] 的值是0。

B. 1

  • 这个选项不正确,因为 a[0][1] 的值不是1。

C. 5

  • 这个选项不正确,因为 a[0][1] 的值不是5。

D. 4

  • 这个选项不正确,因为 a[0][1] 的值不是4。

因此,正确的答案是 A。

37.若有数组定义int a[10],下列选项中不正确的是()。

A.数组a有10个元素

B.数组a的最后一个元素是a[10]

C.数组a的第一个元素的值是*a

D.数组a的在内存中字节数是sizeof(int)*10

解析:

本题选B,最后一位是a[9]。

38.若有定义int a[2][5],a[0][1]的地址是X,且一个整型数据占用两个字节的内存空间,则a[0][0]和a[1][3]的地址分别为()。

A.X-1,X+7

B.X-2,X+14

C.X+1,X+7

D.X-1,X+14

解析:

本题选B,因为a[0][1]是X。所以a[0][0]为X-2,a[1][3]=a[0][0]+(5+3)*2=X-2+16=X+14

39.下列对语句int a[10]={1,2,3,4}理解正确的选项是()。

A.将4个初始值分别赋给a[1]至a[4]

B.将4个初始值分别赋给a[0]至a[3]

C.将4个初始值分别赋给a[6]至a[9]

D.因为数组长度与初始值个数不相同,所以此语句不正确

解析:

本题选B,参考数组的定义

40.设x,y为字符型变量,执行scanf("x=%c,y=%c",&x,&y);后使x为'X',y为'Y',下列输入正确的是()。

A.'X','Y'

B.x='X',y='Y'

C.X=X,Y=Y

D.x=X,y=Y

解析:

本题选D,参考输入的定义

41.下列关于C++流的描述,正确的是()。

A.只能借助于流对象进行输入输出

B.只能使用运算符>>和<<进行输入输出

C.只能借助于cin和cout进行输入输出

D.cerr不是C++预留的流对象

解析:

C++中的流(stream)是一种用于输入输出的机制,它允许程序与外部世界进行数据交换。流可以分为输入流和输出流,分别用于从外部源读取数据和向外部目标写入数据。

选项分析:

A. 只能借助于流对象进行输入输出

  • 这是正确的。在C++中,所有的输入输出操作都是通过流对象来完成的。例如,cin是一个预定义的输入流对象,cout是一个预定义的输出流对象。

B. 只能使用运算符>>和<<进行输入输出

  • 这是不正确的。虽然>><<是C++中常用的输入输出运算符,但并不是唯一的方式。例如,还可以使用getline()函数进行字符串输入,使用put()函数进行字符输出等。

C. 只能借助于cin和cout进行输入输出

  • 这是不正确的。虽然cincout是C++中最常用的输入输出流对象,但并不是唯一的。例如,cerrclog也是预定义的输出流对象,分别用于标准错误输出和日志输出。

D. cerr不是C++预留的流对象

  • 这是不正确的。cerr是C++中预定义的标准错误输出流对象,用于输出错误信息。

因此,正确的答案是A. 只能借助于流对象进行输入输出。

42.下列关于C++输入输出的叙述,正确的是()。

A.cout是I/O流库预定义的对象

B.只能借助于cin和cout进行输入输出

C.C++中使用cout进行屏幕输入

D.C++流只能进行格式化输入输出

解析:

本题选A

A. cout是I/O流库预定义的对象

B. 只能借助于cin和cout进行输入输出

  • 这是不正确的。虽然cincout是C++中最常用的输入输出流对象,但并不是唯一的。例如,cerrclog也是预定义的输出流对象,分别用于标准错误输出和日志输出。

C. C++中使用cout进行屏幕输入

  • 这是不正确的。在C++中,cout用于屏幕输出,而cin用于屏幕输入。

D. C++流只能进行格式化输入输出

  • 这是不正确的。C++流不仅可以进行格式化输入输出(使用cincout),还可以进行非格式化输入输出。例如,可以使用getline()函数进行字符串输入,使用put()函数进行字符输出等。

43.使用C++流进行输入输出格式控制,需要包含下列( )的头文件。

A.ostream

B.istream

C.fstream

D.iomanip

解析:

本题选D,

使用C++流进行输入输出格式控制,需要包含的头文件是D. iomanip。

C++中,#include<iomanip>用于包含输入/输出流操作符的头文件。这个头文件中定义了多种控制符,可以对输入/输出流进行格式化控制,例如设置数值的进制、对齐方式、填充字符

等。

44.C++中,操作符setw(n)的含义是()。

A.将输出字段的宽度设置为n

B.将浮点精度设置为n

C.将基数设置为n

D.结果保留n位小数

解析:

本题选A,

C++中,操作符setw(n)的含义是将输出字段的宽度设置为n

当输出项的实际字符数少于n时,系统会在左侧自动填充空格,确保输出项的宽度达到n。如果输出项的字符数多于n,则宽度会自动扩展,不会截断内容

45.下列描述符合b=a++和b=++a区别的是()

A.二者都是后者先将a增加1,再将a的值赋给b

B.前者是先将a赋值给b,再将a增加1;后者先将a增加1,再将a的值赋给b

C.前者先将a增加1,再将a的值赋给b;后者是先将a赋值给b,再将a增加1

D.两者都是先将a赋值给b,再将a增加1

解析:

本题选C,运算符优先级的简单题,不多讲

46.下面()不是C++的运算符

A.=!

B.?:

C.new

D.[]

解析:

A. =!

  • 这是不正确的。=!并不是C++中的运算符。

B. ?:

  • 这是正确的。? :是C++中的条件运算符,也称为三元运算符。它的语法格式为condition ? expr1 : expr2,根据condition的值来选择执行expr1expr2

C. new

  • 这是不正确的。new是C++中的关键字,用于动态分配内存,但它不是运算符。

D. []

  • 这是正确的。[]是下标访问操作符,用于数组和字符串等数据结构的元素访问。

因此,下列选项中不是C++的运算符的是A. =!。

相关推荐
OTWOL3 分钟前
两道数组有关的OJ练习题
c语言·开发语言·数据结构·c++·算法
问道飞鱼6 分钟前
【前端知识】强大的js动画组件anime.js
开发语言·前端·javascript·anime.js
拓端研究室6 分钟前
R基于贝叶斯加法回归树BART、MCMC的DLNM分布滞后非线性模型分析母婴PM2.5暴露与出生体重数据及GAM模型对比、关键窗口识别
android·开发语言·kotlin
Code成立8 分钟前
《Java核心技术I》Swing的网格包布局
java·开发语言·swing
Auc2412 分钟前
使用scrapy框架爬取微博热搜榜
开发语言·python
QQ同步助手19 分钟前
C++ 指针进阶:动态内存与复杂应用
开发语言·c++
凯子坚持 c25 分钟前
仓颉编程语言深入教程:基础概念和数据类型
开发语言·华为
小爬虫程序猿27 分钟前
利用Java爬虫速卖通按关键字搜索AliExpress商品
java·开发语言·爬虫
程序猿-瑞瑞29 分钟前
24 go语言(golang) - gorm框架安装及使用案例详解
开发语言·后端·golang·gorm
qq_4335545430 分钟前
C++ 面向对象编程:递增重载
开发语言·c++·算法