第二部分 面试笔试技术篇
第10章 C++程序设计基础 (2018年11月6日阅读)
10.1 程序的编译和执行
小结:无 图10.1
【面试题1】简述 #include<> 和 #include"" 的区别
#include<> 直接从编译器指定的路径出搜索; #include "" 首先在程序当前目录中进行搜索,然后再从编译器指定的路径处搜索;
【面试题2】简述 # 和 ## 在 define 中的作用
宏定义中的#运算符将其后面的参数转换成字符串;
宏定义中的##运算符将前后的参数进行字符串连接;
【面试题3】简述 assert 断言的概念
assert 用于在程序的DEBUG版本中检测条件表达式,如果结果为假,则输出诊断信息并且终止程序运行。 assert其实是一个带参数的宏,并非一个函数,可以在 assert.h 里面找到定义. 一个好的编程习惯是在调试结束之后,在 #include 语句之前插入 #define NODEBUG 禁用 assert 宏。 最好在每个 assert 里面只检测一个条件。 不要在 assert 里面更改变量值,因为assert 只在DEBUG版本里起作用,使用了 RELEASE版本,所有的 assert 都会被忽略。 对外接口的参数检查不要用assert,要用 if 。因为 assert 是为了捕获哪些可控的不该发生的情况,接口使用者的入参对接口开发人员不可控。
10.2 变量
小结: C++在变量命名的时候要求变量中只能包含字母,数字和下划线,并且第一个字符只能是字母或者下划线。
(0)全局变量:在函数内部定义的变量称为局部变量,只在函数内部可见;在函数外部定义的变量叫做全局变量。
(1)extern 变量:如果把全局变量声明在头文件中,并且用 extern 关键字修饰,作用是将变量导出,表示在任何通过 #include 包含该头文件的文件中都可以使用这个变量。
(2)static 变量:分成「静态局部变量」和「静态全局变量」。静态局部变量作用域是函数内部,但是生存期是整个程序的生命周期。静态全局变量 = 静态变量 + 全局变量
(3)const 变量:直接在头文件中声明和定义,多个源文件引用该头文件不会造成重复定义的问题
【面试题1】简述 i++ 和 ++i 的区别。
i++和++i 的区别:i++ 是先赋值后加一,++i 是先加一再赋值。
不同编译器会有不同的处理。比如 VS 和 GCC。比如说, 写出下面代码执行后 i,j,m,n 的值:
int i = 10, j = 10; int m = (i++) + (i++) + (i++); int n = (++j) + (++j) + (++j);
解答:在VS 2005的编译器中,首先 j 会自增 3次,j 先变成 13, 然后计算 13 + 13 + 13 = 39; 在GCC 编译器中,只要有两个完整的操作数,就会立即执行加法操作,也就是说, ++j 在执行两次之后,已经准备好了两个操作数,此时 j = 12,这个时候会做第一次加法运算,结果是 24,然后和第三次 ++j 的结果 13 又做了一次加法,所以答案是 12 + 12 + 13 = 37;
vs2005: i = 13, j = 13, m =30, n = 39 GCC: i = 13, j = 13, m = 30, n = 37
【面试题2】 简述C++的类型转换操作符
一共有四种:static_cast, dynamic_cast, const_cast, reinterpret_cast
(1) static_cast:
(2) dynamic_cast:
(3) const_cast:
(4) reinterpret_cast:
【面试题3】简述静态全局变量的概念
10.3 条件语句和循环语句
小结:无知识点,都会了
【面试题1】不使用 break 的 switch 语句
【面试题2】for 循环的三要素
【面试题3】巧妙打印乘法口诀表
10.4 宏定义和内联
小结:
【面试题1】简述内联函数与宏定义的区别
【面试题2】宏定义的宏展开错误
【面试题3】内联函数的常识性问题
10.5 sizeof 的使用
小结:
【面试题1】不能用 sizeof 计算的表达式
【面试题2】sizeof 计算结构体时的内存对齐问题
【面试题3】结构体嵌套时的 sizeof 运算
10.6 内存分配
小结:
【面试题1】malloc 和 free 的常识性问题
【面试题2】返回一个 64 整数倍的内存地址
【面试题3】简述 malloc/free 和 new/delete 的区别
【面试题4】简述 delete 和 delete[] 的区别
10.7 位运算
小结:
【面试题1】不使用临时变量交换两个数
【面试题2】计算二进制中 1 的个数
【面试题3】将二进制数倒数第 M 位的前 N 位取反
【面试题4】找出人群中唯一的单身狗 (剑指offer 原题)
【面试题5】找出人群中三个单身狗中的任意一个 (剑指offer 原题的类似题)
10.8 main函数
小结:
【面试题1】简述 main 函数执行前后都发生了什么