关于下述代码,说法错误的是( )。
01int multiply(int x, int y); 02 03int main() { 04 int a = 4; 05 int b = 5; 06 int result = multiply(a, b); 07 std::cout << "The result is: " << result << std::endl; 08 return 0; 09} 10 11int multiply(int x, int y) { 12 return x * y; 13}
A:函数 multiply 的定义应该放到函数 main 之前——错误。代码先声明 multiply(提供原型),main 中可正常调用,定义在 main 之后也是合法的(C++ 允许前置声明+后定义)。
执行下述代码将输出( )。
01int x = 10; 02void func() { int x = 20; std::cout << x; } 03int main() { 04 func(); 05 std::cout << x; 06 return 0; 07}
B:2010。func 内有局部 x=20 输出 20;main 中 cout<<x(全局 x=10)输出 10,串起来为 2010。
执行下述代码后,变量 a 的值为( )。
01int a = 10; 02int* p = &a; 03*p = 20
B:20。*p=&a 后 *p 即 a 本身,*p=20 把 a 改为 20。
以下哪种参数传递方式可以避免拷贝大型对象?
D:引用传递和指针传递均可。引用和指针都不拷贝实参对象(只传地址),适合大对象;值传递会完整拷贝对象。
执行下述代码,将输出( )。
01void swap(int a, int &b) { 02 int temp = a; 03 a = b; 04 b = temp; 05} 06int main() { 07 int x = 1, y = 2; 08 swap(x, y); 09 std::cout << x << y; 10 return 0; 11}
D:11。swap(x,y) 中 a 值传递拷贝(不改 x),b 引用绑 y(会改 y):函数内 a=x=1,b=y=2, temp=1, a=2, b=1;但实参 x 不受影响,y 变 1。main 输出 x=1 y=1 → 11。
下面的描述中,( )正确定义一个名为 Person 的结构体并正确初始化了一个 Person 结构体的变量 p。
C:Person p = { "Yang", 10 };。C++ 聚合初始化可用大括号按成员顺序赋值;A 调用构造函数(Person 无自定义构造),B string 后缺分号是语法错,D new 返回指针需用 Person*。
给定如下代码,下面描述错误的是( )。
01struct Person { 02 std::string name; 03 int age; 04 struct Address { 05 std::string street; 06 std::string city; 07 }; 08 Address address; 09};
D:结构的嵌套可以减少命名冲突,因此可以不必控制嵌套层次——错误。嵌套过深会增加理解难度和耦合,应控制嵌套层数(一般不超过 3 层)。
假设 int arr[2][3] = {{1,2,3},{4,5,6}};,则 arr[1][2] 的值是( )。
D:6。int arr[2][3]={{1,2,3},{4,5,6}} 中 arr[1][2] 是第二行第三列 = 6。
下面( )正确定义了二维数组。
B:int arr[3][4]。二维数组声明语法必须是两个方括号;A 逗号错(不是 C++ 数组语法),C 函数调用语法错,D 数组大小不能为负。
小杨正在爬楼梯,需要爬 阶才能到达楼顶。如果每次可以爬 个或 个台阶,下面代码采用递推算法来计算一共有多少种不同的方法可以爬到楼顶,则横线上应填写( )。
01int f(int n) { 02 if (n == 1 || n == 2) 03 return n; 04 05 int f1 = 1; 06 int f2 = 2; 07 int res = 0; 08 for (int i = 3; i <= n; i++) { 09 ____________ // 在此处填入代码 10 } 11 return res; 12}
B:res = f1 + f2; f1 = f2; f2 = res;。爬楼梯递推:f(n)=f(n-1)+f(n-2),res=f1+f2 计算当前项,然后 f1=f2, f2=res 为下轮准备;用 = 而非 += 避免累加错误。
给定如下算法,其时间复杂度为( )。
01bool f(int arr[], int n, int target) { 02 for (int i = 0; i < (1 << 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 × 2ⁿ)。外层 i 遍历 0..2ⁿ-1(共 2ⁿ 次),内层 j 遍历 0..n-1 每次 O(1) 操作,总时间 O(n × 2ⁿ)。
下面关于排序稳定性的描述,正确的是( )。
B:稳定排序保证相同元素的相对顺序不变。这是排序稳定性的标准定义;A 错(稳定性与时间复杂度无关),C 错(选择排序不稳定),D 错(插入排序稳定)。
对数组 arr[]={5, 3, 8, 1} 进行升序排序,执行第一轮冒泡排序后数组 arr 中的内容为( )。
A:3,5,1,8。{5,3,8,1} 第一趟冒泡:5>3 换 {3,5,8,1};5<8 不换;8>1 换 {3,5,1,8},最大 8 沉底。
运行下面的代码,将出现( )。
01double hmean(double a, double b) { 02 if (a == -b ) 03 throw runtime_error("Runtime error occurred."); 04 return 2.0*a*b/(a + b); 05} 06 07int main() { 08 double x = 10; 09 double y = -10; 10 11 try { 12 int result = hmean(x, y); 13 cout << "hmean: " << result << endl; 14 } 15 catch (const runtime_error& e) { 16 cout << "Caught: " << e.what() << endl; 17 } catch (...) { 18 cout << "Caught an unknown exception." << endl; 19 } 20 return 0; 21}
A:Caught: Runtime error occurred.。hmean(10,-10) 中 a==-b 触发 throw runtime_error;main 中 catch(const runtime_error&) 匹配,输出 Caught: + e.what()。
下面哪种方式不能实现将字符串 "Happy Spring!" 输出重定向到文件 log.txt( )。
C:创建 outFile 但用 cout 输出——不能重定向。cout 默认输出到 stdout,与 ofstream 无关;其他 A/B/D 都能把字符串写入 log.txt。
函数是 C++ 中的核心概念,用于封装可重用的代码块。
正确。函数是 C++ 核心概念,用于把可重用代码封装为命名单元,提高模块化和复用性。
在 C++ 中,函数的返回类型可以省略,默认为 int。
错。C++ 不允许省略函数返回类型(C99 等 C 语言历史特性允许默认 int,C++ 已废弃)。
结构体的成员默认是 public 访问权限。
正确。struct 成员默认 public 访问权限(与 class 默认 private 不同);struct 适合 POD 数据类型。
假设整数数组 arr[4] = {0, 1, 2, 3}; 的第一个元素在内存中的地址为 0x7ffee4065820,经过 int* p = arr; p += 1; 后,指针 p 的值是 1。
错。p += 1 是指针算术,p 自增一个 int(4 字节),新指针值是 0x7ffee4065824(地址),不是整数 1。
二维数组作为函数参数时,必须显式指定所有维度的大小。
错。二维数组作函数参数时,第二维(列数)必须显式指定,第一维可省略(编译器按指针处理)。
递推是一种通过已知的初始值和递推公式,逐步求解目标值的算法。
正确。递推通过初始值和递推关系式逐步求解更大规模问题,是递推的定义。
考虑最坏情况下冒泡排序算法的时间复杂度, 为待排序数字的数目为 的复杂度,则其递推关系式为 ,。
正确。冒泡最坏情况(逆序)每趟需 n-1,n-2,...,1 次比较,总比较次数 n(n-1)/2,T(n)=T(n-1)+n 递推解为 O(n²)。
插入排序在最好情况(已有序)下的时间复杂度是 。
错。插入排序最好情况(数组已有序)每趟只需 1 次比较,共 n-1 次比较,时间复杂度 O(n),不是 O(n²)。
对数组 arr[]={4, 3, 1, 5, 2} 进行升序排序,执行第一轮选择排序后数组 arr 中的内容是 {1, 4, 3, 5, 2}。
错。{4,3,1,5,2} 第一轮选择排序找最小 1 在 index 2,与首位 index 0 的 4 交换得 {1,3,4,5,2},而非 {1,4,3,5,2}。
未捕获异常会调用 std::terminate 终止程序。
正确。未被任何 catch 匹配的异常会调用 std::terminate() 终止程序。