笔试题(2024/8/19)

一、简答题

1.简述#ifdef、#else、#endif和#iFndef 的作用

#ifdef、#else、#endif 和 #ifndef 是 C/C++ 中的预处理指令,用于条件编译。它们的作用是根据条件来控制代码的编译过程。

  • #ifdef(即 “if defined”)指令用于检查一个宏是否已定义。如果该宏已被定义,则编译下面的代码块;否则,跳过该代码块。

  • #else 指令在与 #ifdef 配对使用时,表示如果前面的宏未定义,则编译下面的代码块。

  • #endif 指令用于结束 #ifdef 或 #ifndef 块。

  • #ifndef(即 “if not defined”)指令与 #ifdef 相反,用于检查一个宏是否未定义。如果该宏未定义,则编译下面的代码块;否则,跳过该代码块。

2.sizeof和strlen的区别

1.sizeof 是运算符,而strlen 是C语言库函数中的一个函数;

2.sizeof 操作符用于计算变量或类型的大小,一般单位为字节,通常用于计算内存大小;

3.strlen是计算字符串长度的,遇到\0结束,返回不包括\0,即如果没有\0则会计算出随机值;


3.C语言的malloc和C十+中的new有什么区别

malloc 是 C 语言中的函数,只负责分配内存,不会调用构造函数或初始化对象,分配失败时返回 NULL,释放时用 freenew 是 C++ 中的运算符,除了分配内存,还会调用构造函数进行对象初始化,分配失败时抛出异常(或返回 nullptr),释放时用 delete,更符合 C++ 的面向对象特性。

4.一个参数可以即是const 又是volatile吗?

可以,const 修饰参数,表示该参数在程序内部是只读的,volatile 修饰参数,表示该参数可能会在程序运行期间被外部设备等因素改变。const 和 volatile 同时修饰,则意味着该参数在程序执行过程中不能从内部改变,但可以受到外界条件的影响而改变,所以每次使用这个变量时,程序都是从内存中去读取该值,而不是从寄存器读取它的备份。
注意一点, const关键字在编译期发挥作用,它并没有实际禁止某段内存的读写。
所以,只要同时需要两者的特性,就可以使用 const 和 volatile 关键字修饰同一个参数。


5.说一说c++中四种cast转换

1. static_cast
用于基本数据类型之间的转换,如int转换为double,也可以用于类层次结构中的向上转换(子类转换为父类),但不能用于向下转换(父类转换为子类)。

2. dynamic_cast
用于类层次结构中的向下转换(父类转换为子类),但只能用于含有虚函数的类,且转换时会进行类型检查,如果转换失败则返回空指针。

3. reinterpret_cast
用于将一个指针转换为另一个类型的指针,或将一个整数转换为指针类型,但不进行类型检查,慎用。

4. const_cast
用于去除指针或引用类型的const属性,使其可以修改被指向的对象,但不能用于去除非const类型的const属性。


6.C++类内可以定义引用数据成员吗?

        在C++中,类内是可以定义引用数据成员的,但是在初始化对象时,必须在构造函数的成员初始化列表中对引用进行初始化,因为引用必须在创建时被初始化,并且不能在其生存期内引用不同的对象

7.什么是右值引用,跟左值又有什么区别

值引用是C++11的新特性,用于实现转移语义和精确传递,旨在消除不必要的对象拷贝,提升效率,并简化泛型函数定义。左值是指能取地址或具名的对象,右值则是临时、不可寻址的对象。左值可寻址、可赋值且可变,而右值则不可寻址,只能用于给左值赋值,且右值引用通常不可变。

8.链表和数组有什么区别

1、存储方式不同
数组是连续存储,数组在创建时需要一个整块的空间。

链表是链式存储,链表在内存空间中不一定是连续的。

数组一般创建在栈区,链表一般创建在堆区,在增加节点时需要new或malloc新节点,相较于数组长度不固定,自由度高。

2、访问元素方式不同
数组可以通过下标随机访问,单向链表只能通过头结点从前向后访问链表中的元素。

3、增删效率不同
数组在插入或删除的时候需要移动链表中的其他元素,时间复杂的为O(n)。

链表在进行插入删除时,找到要插入或删除的位置后,增删时间复杂度为O(1)。

所以当线性表进行大量的插入和删除操作时建议使用链表,若主要对线性表进行查找操作,较少进行插入操作是建议使用数组。


9.简述队列和栈的异同

栈与队列的相同点:

1.都是线性结构。

2.插入操作都是限定在表尾进行。

3.都可以通过顺序结构和链式结构实现。、

4.插入与删除的时间复杂度都是O(1),在空间复杂度上两者也一样。

5.多链栈和多链队列的管理模式可以相同。

栈与队列的不同点:

1.删除数据元素的位置不同,栈的删除操作在表尾进行,队列的删除操作在表头进行。

2.应用场景不同;常见栈的应用场景包括括号问题的求解,表达式的转换和求值,函数调用和递归实现,深度优先搜索遍历等;常见的队列的应用场景包括计算机系统中各种资源的管理,消息缓冲器的管理和广度优先搜索遍历等。

3.顺序栈能够实现多栈空间共享,而顺序队列不能。

二、编程题

1.写一个宏MIN,返回两个数小的那个

#define MIN(x,y) ((x) > (y) ? (y) : (x))

2.写出int、bool、 float,指针变量与“零值” 比较的if语句

// 与bool类型比较
if(!val)

//与int 型比较
if(var==0)

//与指针变量比较
if(var == NULL)

//与float型比较
const float EPSINON = 0.00001;
if ((x >= - EPSINON) && (x <= EPSINON)

3.设置地址为0x13579的整型变量的值为0x97351

int *ptr;

ptr = (int *)0x13579;

*ptr = 0x97351;


4.编码实现字符串转化为数字

#include <stdio.h>
#include <stdlib.h>

int main() {
    char str[] = "12345";
    int num = atoi(str);
    printf("转换后的数字是: %d\n", num);
    return 0;
}

  • 17
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值