目录
《C和C++程序员面试秘笈》-董珊山海编著
1. 一般赋值语句
& 按位与 对应的具体的数
&& 逻辑与 0或1
|| 逻辑或 0或1
三目运算符 有时可以代替条件判断 if/else/else if
2. C++域操作符
同名时:局部变量优先调用
C++中通过域操作符“::”来直接操作全局变量
3. i++和++i的区别
i++ 先使用i的值进行运算,再把i自增1
++i 先把i自增1,再使用i的值进行运算
4. i++和++i哪个效率更高
1、考虑内建数据类型时,效率差别不大(去除编译器优化的影响)
2、考虑自定义数据类型(主要是指类)的情况时
前缀式可以返回对象的引用,而后缀式必须返回对象的值,所以导致在大对象的时候产生的较大的复制开销,引起效率降低
因此,处理使用自定义类型(注意不是指内建类型)的时候,应该尽可能地使用前缀式(++i,--i)递增递减
总结:
内建数据类型的情况,效率没有区别
自定义数据类型的时候,前缀式递增递减效率较高
5. 选择编程风格良好的条件比较语句
布尔变量的名称为flag
if(flag)
if(!flag)
整型变量的名字为value
if(value == 0)
if(value != 0)
float、double有精度限制,设法转化成">=" "<="形式;判断x与0.0是否相同
if((X >= -EPS) && (X <= EPS))
if((X > EPS) || (X < -EPS))
指针变量
if(p == NULL)
if(p != NULL)
6. 有符号变量与无符号变量的值的转换
P9 -- P10 !!!待整理 int 与unsigned int之间的转换
7. 数据交换 swap
引用传参
法1 使用异或运算完成交换(推荐使用!!!)
void swap(int & a,int & b)
{
a ^= b;
b ^= a;
a ^= b;
}
法2 使用加减法运算完成交换(有可能发生数据溢出)
void swap(int & a,int & b)
{
a = a+b;
b = a-b;
a = a-b;
}
8. C和C++有什么不同
最大的区别在于,它们用于解决问题的思想方法不同
1、C是一个结构化语言,它的重点在于算法和数据结构
C程序的设计首要考虑的是如何通过一个过程,对输入进行处理,得到输出
2、C++首先考虑的是如何构建一个对象模型,让这个模型能够配合对应的问题,这样就可以通过获取对象的状态信息得到输出或实现过程控制
C++相对于C有所加强,引入了 重载、内联函数、异常处理等
C++相对于C有所扩展,拓展了面向对象设计的内容,如类、继承、虚函数、模板、容器
C++中不仅需要考虑数据封装,还需要考虑对象粒度的选择、对象接口的设计和继承、组合与继承的使用等问题
10. 标准头文件的结构
//防止头文件被重复引用
#ifndef __XXX_H__
#define __XXX_H__
#endif
//表示当前使用的是C++编译器
//extern “C” 是C++编译器提供的与C连接交换指定的符号,用来解决名字冲突问题
//告诉C++编译器,这部分代码按C语言的格式进行编译和链接,而不是C++的
#ifdef __cplusplus
extern "C" {
#endif
#ifdef __cplusplus
}
#endif
11. #include < >和#include " "有什么区别
< > 表名这个文件是标准头文件
" " 表名这个文件是用户提供的头文件,查找该文件时将从当前文件目录(或文件名指定的其他目录)中寻找文件,然后在标准位置寻找文件
12. atexit()函数 注册程序正常终止时要被调用的函数
可以用atexit()函数来注册程序正常终止时要被调用的函数
atexit()函数的参数是一个函数指针,函数指针指向一个没有参数也没有返回值的函数
atexit()函数原型为:int atexit(void (*)(void))
并且在main()函数结束时调用,调用这些函数的顺序与注册它们的顺序相反;最先注册的最后调用,最后注册的最先调用
参数压栈造成的,参数由于压栈顺序而后入先出