运行下面程序后变量 a 的值是( )。
01int a = 42; 02int* p = &a; 03*p = *p + 1;
B:43。a=42, p=&a, *p=*p+1 即 a=42+1=43。
以下关于数组的描述中,( )是错误的。
C:数组可以像指针一样进行自增操作——错误。数组名是指针常量(值不可改),不能 a++;指针变量才能 ++。
给定如下定义的数组 arr,则 *(*(arr + 1) + 2) 的值是( )。
01int arr[2][3] = {{1, 2, 3}, {4, 5, 6}};
D:6。arr[2][3]={{1,2,3},{4,5,6}} 中 ((arr+1)+2) 即 arr[1][2]=6(行优先,arr+1 跳到第二行)。
下面这段代码会输出( )。
01int add(int a, int b = 1); // 函数声明 02 03int main() { 04 cout << add(2) << " " << add(2, 3); 05 return 0; 06} 07 08int add(int a, int b) { // 函数定义 09 return a + b; 10}
A:3 5。add(int a, int b=1) 默认参数在声明中给出;add(2) 用默认 b=1 得 3,add(2,3) 得 5;定义处不重复默认参数也合法。
下面这段代码会输出( )。
01int x = 5; 02 03void foo() { 04 int x = 10; 05 cout << x << " "; 06} 07 08void bar() { 09 cout << x << " "; 10} 11 12int main() { 13 foo(); 14 bar(); 15}
D:10 5。foo 局部 x=10 输出 10;bar 中无局部 x,输出全局 x=5。
下面程序运行的结果是( )。
01void increaseA(int x) { 02 x++; 03} 04void increaseB(int* p) { 05 (*p)++; 06} 07int main() { 08 int a = 5; 09 increaseA(a); 10 cout << a << " "; 11 increaseB(&a); 12 cout << a; 13}
C:5 6。increaseA 值传递不改 a,increaseB(&a) 通过 *p++ 把 a 从 5 改为 6;输出 5 6。
关于结构体初始化,以下哪个选项中正确的是( )。
01struct Point {int x,y;};
B:Point p = {1,2};。C++ 聚合初始化用大括号按成员顺序赋值;A 圆括号是函数调用语法,C new 应返回指针,D 尖括号语法错。
运行如下代码会输出( )。
01struct Cat { 02 string name; 03 int age; 04}; 05 06void birthday(Cat& c) { 07 c.age++; 08} 09 10int main() { 11 Cat kitty{"Mimi", 2}; 12 birthday(kitty); 13 cout << kitty.name << " " << kitty.age; 14}
B:Mimi 3。birthday(Cat& c) 引用传 kitty,c.age++ 直接改 kitty.age 从 2 到 3;输出 "Mimi 3"。
关于排序算法的稳定性,以下说法错误的是( )。
C:选择排序是稳定的排序算法——错误。选择排序把最小元素与首位交换,交换元素不一定相邻,相等元素相对顺序可能改变,不稳定。
下面代码试图实现选择排序,使其能对数组 nums 排序为升序,则横线上应分别填写( )。
01void selectionSort(vector<int>& nums) { 02 int n = nums.size(); 03 for (int i = 0; i < n - 1; ++i) { 04 int minIndex = i; 05 for (int j = i + 1; j < n; ++j) { 06 if ( ____________ ) { // 在此处填入代码 07 minIndex = j; 08 } 09 } 10 ____________; // 在此处填入代码 11 } 12}
A:nums[j] < nums[minIndex]; swap(nums[i], nums[minIndex])。选择排序升序:若 nums[j] 比当前最小 nums[minIndex] 还小就更新 minIndex;每趟结束后把 nums[i] 与 nums[minIndex] 交换。
下面程序实现插入排序(升序排序),则横线上应分别填写( )。
01void insertionSort(int arr[], int n) { 02 for (int i = 1; i < n; i++) { 03 int key = arr[i]; 04 int j = i - 1; 05 while ( j >= 0 && ____________ ) { // 在此处填入代码 06 arr[j + 1] = arr[j]; 07 j--; 08 } 09 ____________; // 在此处填入代码 10 } 11}
A:arr[j] > key; arr[j + 1] = key。插入排序升序:while 内若前面元素比 key 大就后移腾位,循环结束后把 key 插入 j+1 位置。
关于插入排序的时间复杂度,下列说法正确的是( )。
B:最好情况是 O(n),最坏情况是 O(n²)。插入排序最好(已有序)只需 n-1 次比较 O(n);最坏(逆序)O(n²)。
小杨正在爬楼梯,需要 阶才能到达楼顶,每次可以爬 阶或 阶,求小杨有多少种不同的方法可以爬到楼顶,横线上应填写( )。
01int climbStairs(int n) { 02 if (n <= 2) return n; 03 int prev2 = 1; 04 int prev1 = 2; 05 int current = 0; 06 for (int i = 3; i <= n; ++i) { 07 ____________ // 在此处填入代码 08 09 } 10 return current; 11}
A:prev2 = prev1; prev1 = current; current = prev1 + prev2。爬楼梯 f(n)=f(n-1)+f(n-2),注意 prev1 在 current = prev1+prev2 后已被更新为新 prev1。
假设有一个班级的成绩单,存储在一个长度为 的数组 scores 中,每个元素是一个学生的分数。老师想要找出所有满足 scores[i] + scores[j] + scores[k] == 300 的三元组,其中 。下面代码实现该功能,请问其时间复杂度是( )。
01int cnt = 0; 02for (int i = 0; i < n; i++) { 03 for (int j = i + 1; j < n; j++) { 04 for (int k = j + 1; k < n; k++) { 05 if (scores[i] + scores[j] + scores[k] == 300) { 06 cnt++; 07 } 08 } 09 } 10}
C:O(n³)。三层嵌套循环 i<j<k 各遍历 O(n) 次,总迭代次数 n(n-1)(n-2)/6 = O(n³)。
关于异常处理,以下说法错误的是( )。
D:所有异常都必须被捕获,否则程序会崩溃——错误。未捕获的未捕获异常会调用 terminate 终止程序,但「必须捕获」说法不对(程序可能设计为直接终止,或有 catch(...) 兜底,或异常未抛出等)。
以下代码能正确初始化指针。
01int a = 5; 02int *p = a;
错。int *p = a 应为 int *p = &a;p 应存地址,a 是值,类型不匹配。
执行下面 C++ 代码将输出 。
01int x = 10; 02void f() { 03 int x = x + 1; 04 cout << x << endl; 05} 06 07int main() { 08 f(); 09}
错。f 内 int x = x + 1 中局部 x 声明后立即使用自身初始化(UB),结果不是 11;且外层全局 x=10 不被使用。
以下 C++ 代码合法。
01struct Student { 02 string name; 03 int age; 04 float score; 05}; 06Student* students = new Student[20];
正确。Student* students = new Student[20] 动态分配 Student 数组并用指针 students 接收,语法正确。
执行下面 C++ 代码将输出 。
01void func(int* p) { 02 *p = 10; 03} 04 05int main() { 06 int a = 5; 07 func(&a); 08 cout << a << endl; 09 return 0; 10}
正确。func(&a) 传地址,*p=10 把 a 改为 10;cout<<a 输出 10。
下面代码将二维数组 arr 传递给函数 f,函数内部用 arr[i][j] 访问元素,函数参数声明为 int arr[][4] 是错误的。
01void f(int arr[][4], int rows) { 02 // 访问 arr[i][j] 03} 04 05int main() { 06 int arr[3][4] = { /* 初始化 */ }; 07 f(arr, 3); 08}
错。int arr[][4] 作函数参数是合法的:第一维可省略(编译器按指针处理),第二维必须指定。
递推是在给定初始条件下,已知前一项(或前几项)求后一项的过程。
正确。递推定义:基于已知初始条件和前一项(或前几项)求后一项。
虽然插入排序的时间复杂度为 ,但由于单元操作相对较少,因此在小数据量的排序任务中非常受欢迎。
正确。插入排序虽然 O(n²),但单元操作少(赋值优于交换)、对近有序数据高效、实现简单,小数据量排序表现良好。
对整数数组 {4, 1, 3, 1, 5, 2} 进行冒泡排序(将最大元素放到最后),执行一轮之后是 {4, 1, 3, 1, 2, 5}。
错。{4,1,3,1,5,2} 第一轮冒泡(最大元素沉底):4>1 换 {1,4,3,1,5,2},4>3 换 {1,3,4,1,5,2},4>1 换 {1,3,1,4,5,2},4<5 不换,5>2 换 {1,3,1,4,2,5},结果是 {1,3,1,4,2,5} 不是 {4,1,3,1,2,5}。
以下代码只能捕获 int 类型异常。
01int main() { 02 try { 03 throw 42; 04 } catch (...) { 05 cout << "Caught" << endl; 06 } 07 return 0; 08}
错。catch(...) 是「捕获所有」通配符,能捕获任何类型异常(包括 int、string、自定义类型等),不是只捕获 int。
以下代码将 Hello 写入文件 data.txt。
ofstream file("data.txt");
cout<<"Hello"<< endl;
file.close();
错。ofstream 创建文件 file 但用 cout<<"Hello" 输出,cout 默认到屏幕不是文件,不能写入 data.txt;应改用 file<<"Hello"。