C++应用

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.youkuaiyun.com/weixin_36474809/article/details/90749387

背景 : 准备秋招笔试。发现算法岗笔试依然会有不少c和数据结构的题,这些题必须好好准备。不然笔试过不了。

目录

一、ASIC II 码

二、存储

2.1 浮点数的存储

2.2 结构体struct存储

2.3 sizeof

三、malloc| free| delete

3.1 内存相关

3.2 内存相关

四、虚函数|类|父类

4.1 内联

4.2 虚函数

4.3 虚函|内联

4.4 静态函数

五、循环

六、静态变量

6.1 静态变量

七、强制类型转换


一、ASIC II 码

在下列字符中,其 ASCII 码值最大的一个是()。

9,Q,d,f

对此我们需要知道ASIC 码从小到大的排列顺序为,数字,大写,小写;符号穿插中间。一共128个。

二、存储

2.1 浮点数的存储

由什么组成?

即阶码和尾数组成。

浮点数由阶码和尾数两部分组成,对任意一个带符号的二进制数N可以如下表示
N=[R∧±j]×(±x)
x为二进制小数,通称尾数
R为阶码的底,即阶的基数,通常为2
j为数的阶码

2.2 结构体struct存储

typedef struct _tag_PARAM {
int ia;
char  cb;
char  cc;
int id;
char  ce;
} Param;
int sz = sizeof(Param);

问sz值为多少?为16

4+1+1+2+4+1+3=16,其中2,3为了补齐用。

https://www.cnblogs.com/lazycoding/archive/2011/03/22/sizeof-struct.html

  • Char偏移量必须为sizeof(char)即1的倍数
  • int偏移量必须为sizeof(int)即4的倍数
  • float偏移量必须为sizeof(float)即4的倍数
  • double偏移量必须为sizeof(double)即8的倍数
  • Short偏移量必须为sizeof(short)即2的倍数

2.3 sizeof

如下代码,调用printf("%s\n", _string(  ))输出结果是Hello。
char buffer[6] = {0};
char *_string(  ) {
char *s = "Hello world";
for(int i = 0; i < (sizeof(buffer)-1); i++) {
buffer[i] = *(s+i);
}
return buffer;
}

解析:个人猜测,buffer除了6个字符之外,应该还有个'\0'字符,sizeof(buffer)值为7,但是按照答案的意思是6,所以这个需要做实验来确定。

 

三、malloc| free| delete

3.1 内存相关

下面有关new/delete和malloc/free的区别,描述错误的是( )

  • malloc/free是标准库函数,new/delete是运算符
  • new初始化对象,调用对象的构造函数,malloc仅仅分配内存
  • new返回的是所分配变量(对象)的指针,malloc返回的是void指针
  • new/delete只能在C++使用,malloc/free只能在C中使用

这题很简单,错的是最后一个,另外几项需要我们查阅一下。

3.2 内存相关

使用char* p = new char[100]申请一段内存,然后使用delete p释放,有什么问题( )?

  • 不会有内存泄露,但不建议用
  • 会有内存泄露
  • 编译就会报错,必须使用delete [] p
  • 编译没问题,运行会直接崩溃

这题我们认为,开辟了内存,但是删除了指针,找不到相应的内存,因此内存泄露。不知道是否正确。

正确答案是,不会有内存泄露,但是不建议用,可能开辟的时候已经将指针p设置为针对new char的指针,因此delete的时候可以delete其占用的内存。

 

四、虚函数|类|父类

 以下描述正确的是( )?

  • 虚函数是可以内联的,可以减少函数调用的开销,提高效率
  • 类里面可以同时存在函数名和参数都一样的虚函数和静态函数
  • 父类的析构函数是非虚的,但是子类的析构函数是虚的,delete子类对象指针会调用父类的析构函数
  • 选项都不对

解析:正确选项为C,删除子类后,会调用子类的析构函数,子类的析构函数是虚函数,因此往上寻找父类,调用了父类的析构函数。

4.1 内联

计算机科学中,内联函数(有时称作在线函数编译时期展开函数)是一种编程语言结构,用来建议编译器对一些特殊函数进行内联扩展(有时称作在线扩展)。

inline?Inline function。即可以理解为编译器直接讲函数编译到程序之中。

4.2 虚函数

https://baike.baidu.com/item/%E8%99%9A%E5%87%BD%E6%95%B0/2912832?fr=aladdin

在某基类中声明为 virtual 并在一个或多个派生类中被重新定义的成员函数,用法格式为:virtual 函数返回类型 函数名(参数表) {函数体};实现多态性,通过指向派生类的基类指针或引用,访问派生类中同名覆盖成员函数。

虚函数具有多态性。以不同的策略实现不同的方法。

4.3 虚函|内联

https://blog.youkuaiyun.com/shuangshuang37278752/article/details/38875351

虚函数用于运行时多态或晚绑定或动态绑定,内联函数用于提高程序的效率,内联函数的思想:无论内联函数什么时间被调用,在编译时,内联函数的代码段都可以在被替换或插入,当一些小函数在程序中被频繁使用和调用时,内联函数变得十分有用。

类内部定义的所有函数(虚函数除外)都被隐式或自动认为是内联的

使用类的引用或指针调用虚函数时,无论虚函数什么时间被调用,它都不能是内联的(因为虚函数的调用在运行时确定);但是,使用类的对象调用虚函数时,无论虚函数什么时间被调用,它都可以是内联的(因为在编译时编译器知道对象的确定类型)

所以,虚函数不同条件下是否内联不确定,但是是可以内联的。类内调用可以内联。

4.4 静态函数

https://baike.baidu.com/item/%E9%9D%99%E6%80%81%E5%87%BD%E6%95%B0/5644260

函数调用的结果不会访问或者修改任何对象(非static)数据成员,这样的成员声明为静态成员函数比较好。且如果static int func(....)不是出现在类中,则它不是一个静态成员函数,只是一个普通的全局函数,只不过由于 static 的限制,它只能在文件所在的编译单位内使用,不能在其它编译单位内使用。

五、循环

以下描述正确的是( )?

  • while循环语句的循环体至少执行1次
  • do-while循环可以写成while循环的格式
  • continue语句可以出现在各种循环体中
  • break语句不可以出现在循环体内

这题选,continue语句可以出现在各种循环体中,是正确的。

do while至少执行一次。do-while写成while不一样,一个是先执行后判断,一个是先判断后执行。break语句就是出现在循环内提早结束所有循环的,continue是结束当前循环的。

答案是do while可以写成while格式。为什么对了?continue

 

 

六、静态变量

在C语言中,关于静态变量的说法,正确的是( )。

  • 静态变量和常量的作用相同
  • 函数中的静态变量,在函数退出后不被释放
  • 静态变量只可以赋值一次,赋值后则不能改变
  • 静态全局变量的作用域为一个程序的所有源文件

解析:

正确答案选,静态变量在函数退出后不会被释放。因为静态变量是程序执行之前系统就静态分配的变量了。

作用域为当前文件,从定义/声明位置到文件结尾。动态全局变量可以通过extern关键字在外部文件中使用,但静态全局变量不可以在外部文件中使用。静态全局变量相当于限制了动态全局变量的作用域。

静态变量并不是说其就不能改变值,不能改变值的量叫常量。 其拥有的值是可变的 ,而且它会保持最新的值。说其静态,是因为它不会随着函数的调用和退出而发生变化。即上次调用函数的时候,如果我们给静态变量赋予某个值的话,下次函数调用时,这个值保持不变。

6.1 静态变量

https://baike.baidu.com/item/%E9%9D%99%E6%80%81%E5%8F%98%E9%87%8F/10997955?fr=aladdin

存储类名生命周期作用域
extern静态(程序结束后释放)外部(整个程序)
static静态(程序结束后释放)内部(仅翻译单元,一般指单个源文件)
auto,register函数调用(调用结束后释放)

静态变量也可以用于存储常数。具体来说,静态变量(全局变量及汇编语言里定义的符号亦同)可用const,constant或final(根据语言决定)等关键字标识,这时其值就会在编译时设定,并且无法在运行时改变。编译器通常将静态常量与文本一起置于目标文件的文本区域,而非常量初始化数据则置于数据区;而如若有需要,有些编译器还可选择为其开辟专用区;为防止常数变量被错误的指针写入覆盖,亦可在这块区域启用内存保护机制。

七、强制类型转换

有如下一段程序:

  • int f1(float);
  • int f2(char);
  • void f3(float);
  • int (*pf)(float);

以下语句合法的是( )?


 
 
  1. int (*p)( float)=&amp;f1;
  2. pf=&amp;f2;
  3. pf=&amp;f3;
  4. pf=f3;

正确答案是第一个。不太懂。

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值