在 C++ 中,声明一个指向整型变量的指针的正确语法是( )。
A:int* ptr;。C++ 指针声明语法:类型 * 指针名;B/C/D 顺序错,* 应紧贴类型或变量名。
下面的函数接收一个 行 列的二维数组并输出其中元素,则横线上不能填写( )。
01void printArray(____________) { 02 for (int i = 0; i < 3; ++i) 03 for (int j = 0; j < 4; ++j) 04 std::cout << arr[i][j] << " "; 05}
D:int** arr。不能接收二维数组:int** 是指向 int* 的指针,与 int[3][4] 的内存布局不兼容;A/B/C 都正确(B 省略第一维、C 数组指针等价于 B)。
在 C++ 中,int arr[3][4] 和 int* arr = new int[12] 均可模拟一个 行 列的二维数组。关于这两种方式,下面说法错误的是( )。
D:这两种方式申请的内存都能自动释放——错误。int arr[3][4] 栈上分配自动释放;int* arr=new int[12] 堆上分配必须 delete[] arr 手动释放。
关于以下 C++ 代码,说法正确的是( )。
01int main() { 02 greet(); 03 return 0; 04} 05 06void greet() { 07 cout << "Hello!" << endl; 08}
B:编译错误:找不到函数 greet()。main 中调用 greet(),但 greet 定义在 main 之后且没有前置声明,编译器在 main 处看不到 greet 标识符。
在 C++ 中,如果希望通过函数修改传入的结构体对象的内容,应该使用哪种参数传递方式?
C:引用传递或指针传递。值传递拷贝副本不修改原对象;引用和指针都通过地址操作原对象,可修改结构体内容。
以下哪个选项正确描述了 C++ 中形参和实参的区别?
B:形参是函数定义中声明的变量,实参是函数调用时传递给函数的具体值。这是形参/实参的标准定义。
运行如下代码会输出( )。
01int value = 100; 02 03void print1() { 04 int value = 50; 05 cout << value << " "; 06 cout << ::value << " "; 07} 08 09void print2() { 10 cout << value << " "; 11} 12 13print1(); 14print2();
C:50 100 100。print1 内有局部 value=50,输出 50 和 ::value=100;print2 中无局部 value,输出全局 value=100。串接:50 100 100。
小杨在整理一副扑克牌的所有红心扑克牌,使其从小到大排列。他的做法是:最开始抓到的第 张扑克牌被认为是已经排好序;然后抓第 张扑克牌,将其插入至有序部分的正确位置;不断循环步骤,每次将新抓到扑克牌插入至有序部分,直至抓完所有扑克牌,这样抓牌结束时就完成了扑克牌的排序。小杨这种整理扑克牌的方式与( )排序的方式最接近。
B:插入排序。描述「将新抓到扑克牌插入至有序部分」是典型插入排序:维护左侧有序区,每次把新元素插入正确位置。
以下哪种情况是使用插入排序的合适场景?
C:数据几乎有序,只需少量调整。插入排序对近有序数据表现极佳(接近 O(n)),适合此类场景;A 大数据乱序用快排/归并,B 稳定可用归并,D 交换次数最少用选择排序。
以下关于递推算法基本思想的描述,正确的是( )。
B:递推算法从已知的基础情况出发,通过某种关系逐步推导出更大规模问题的解。这是递推算法的核心思想。
给定如下算法,其时间复杂度为( )。
01bool f(int arr[], int n, int target) { 02 for (int i = 0; i < n; i++) { 03 int sum = 0; 04 for (int j = 0; j < n; j++) { 05 if (i & (1 << j)) { 06 sum += arr[j]; 07 } 08 } 09 if (sum == target) return true; 10 } 11 return false; 12}
B:O(n²)。外层 i 循环 n 次,内层 j 循环 n 次(注意 j 范围 j<n 而非 j<(1<<n)),总时间 O(n²)。
下述斐波那契数列计算的时间复杂度是( )。
01int fibonacci(int n) { 02 if (n == 0) return 0; 03 if (n == 1) return 1; 04 return fibonacci(n - 1) + fibonacci(n - 2); 05}
D:O(2ⁿ)。fibonacci 递归无记忆化,递归树每个节点分裂为 2 个子调用,调用次数约 2ⁿ,时间复杂度指数级。
关于下面 C++ 程序的描述,( )最准确。
01ifstream in("data.txt"); 02string line; 03while (getline(in, line)) { 04 cout << line << endl; 05}
C:将 data.txt 中的每一行读取并输出到屏幕。ifstream in("data.txt") 打开文件读,getline(in,line) 逐行读取,cout<<line 输出到屏幕。
在 C++ 中,异常处理机制(try-catch 块)的主要目的是( )。
B:在程序发生运行时错误时,提供一种结构化的错误处理方式。try-catch 把正常逻辑与错误处理分离,是异常处理的核心目的。
为了提高冒泡排序的效率,如果某轮"冒泡"中没有执行任何交换操作,说明数组已经完成排序,可直接返回结果,则两条横线上分别应该填写( )。
01void bubbleSortWithFlag(vector<int> &nums) { 02 for (int i = nums.size() - 1; i > 0; i--) { 03 bool flag; 04 ____________ // 在此处填入代码 05 06 for (int j = 0; j < i; j++) { 07 if (nums[j] > nums[j + 1]) { 08 swap(nums[j], nums[j + 1]); 09 ____________ // 在此处填入代码 10 } 11 } 12 if (!flag) 13 break; 14 } 15}
B:flag = false; flag = true;。每轮冒泡前重置 flag=false,若发生交换则置 flag=true;结束后若 !flag 说明已无交换,提前 break。
下面 C++ 代码正确声明了一个返回 int 类型、接受两个 int 参数的函数。
01int add(int, int);
正确。int add(int, int); 是合法的函数声明(原型),形参名可省略,返回 int 接受两个 int 参数。
下面 C++ 代码的输出是 15 。
01void foo(int x) { 02 x += 5; 03} 04int main() { 05 int a = 10; 06 foo(a); 07 cout << a << endl; 08}
错。foo(int x) 按值传递,函数内 x+=5 只改副本;main 中 a 仍为 10,cout<<a 输出 10,不是 15。
下面 C++ 代码在一个结构体中又定义了别的结构体。这种结构嵌套定义的方式语法不正确。
01#include <string> 02#include <vector> 03 04using namespace std; 05 06struct Library { 07 struct Book { 08 struct Author { 09 string name; 10 int birthYear; 11 }; 12 13 string title; 14 int year; 15 Author author; 16 }; 17 18 string name; 19 vector<Book> books; 20};
错。结构体可以嵌套定义(Library 内 Book, Book 内 Author),C++ 语法完全正确,常用于表达组合关系。
在 C++ 中,相比于值传递,使用引用传递作的优点可以直接操作和修改原始变量,避免数据拷贝,提高效率。
正确。引用传递避免了大对象的拷贝(只传引用),且能直接修改原始变量,比值传递更高效。
下面这段代码不合法,因为每一行都必须显式初始化 个元素。
01int arr[2][3] = {{1, 2}, {3}};
错。int arr[2][3]={{1,2},{3}} 是合法的部分初始化:第一行 1,2,0,第二行 3,0,0,未指定的元素默认初始化为 0,不需要每行显式给满。
以下程序中使用了递推方式计算阶乘(),计算结果正确。
01int factorial(int n) { 02 int res = 1; 03 for (int i = 0; i < n; ++i) { 04 res *= i; 05 } 06 return res; 07}
错。factorial 代码循环 i=0..n-1(漏掉 i=n),res*=0 会得 0,结果错(应是 1×2×...×n);且 0! 应返回 1。
无论初始数组是否有序,选择排序都执行 次比较。
正确。选择排序每趟都要扫描未排序区找最小,不管是否有序都要 O(n²) 次比较(仅交换次数可优化)。
以下 C++ 代码,尝试对有 个整数的数组 arr 进行排序。这个代码实现了选择排序算法。
01for (int i = 0; i < n - 1; ++i) { 02 int minIndex = i; 03 for (int j = i + 1; j < n; ++j) { 04 if (arr[j] < arr[minIndex]) 05 minIndex = j; 06 } 07 if (minIndex != i) 08 swap(arr[i], arr[minIndex]); 09}
正确。代码外层 i 遍历未排序区,内层 j 从 i+1 起找最小元素下标 minIndex,最后 swap(arr[i], arr[minIndex]),正是选择排序的标准实现。
如果一个异常在 try 块中抛出但没有任何 catch 匹配,它将在编译时报错。
错。未被 catch 匹配的异常不会编译报错,运行时调用 std::terminate() 终止程序。
下面 C++ 代码实现将 Hello 写入 data.txt 。
ofstream out("data.txt");
out << "Hello";
out.close();
正确。ofstream out("data.txt") 创建并打开文件 out<<"Hello" 写入字符串,out.close() 关闭文件,data.txt 内容为 Hello。