C/C++ 基础 (2)
1.无符号运算之间不会溢出,无符号和有符号数之间也不会溢出,有符号数之间运算才会溢出
if( a > INT_MAX - b)
2.库函数signal:
作为捕获异步事件的一种方式。
假设malloc函数执行过程中被一个信号中断。此时,malloc函数用来跟踪可用内存的数据结构可能只有部分更新。如果signal处理函数malloc,结果可能是malloc函数用到的数据结构完全崩溃,不堪设想。
信号非常复杂棘手,而且从本质上而言不可移植的特性,解决这个问题,我们最好采取守势,让signal尽可能处理的简单,合理的组织在一起。这样,当需要适应一个新系统时,我们可以轻易的进行修改
3.宏:
1.宏之间的空格: #define f (x) ((x-1))
2.即使宏定义中的各个参数与整个结果表达式都被括号括起来,也可能仍有其他问题存在。宏不是函数,只是文本上的替换。
3.宏展开可能是非常庞大的表达式,占用的空间远超我们所想,这个时候,还不如简单写些语句
4.宏也不是语句
5. 宏并不是类型定义:
#define FOOTYPE struct foo
FOOTYPE a;
FOOTYPE b,c;
以上合法,但我们最好还是使用类型定义:
typedef struct foo FOOTYPE;
6.标识符名称的限制:
为了保证程序的可移植性,谨慎的选择外部标识符名称是重要的。例如自己编写的Malloc中调用malloc函数,由于c语言编译器会把malloc 和Malloc 当做一个,这样就会引起一系列的递归调用。
7.hash表:多线程,设计模式,多线程,Liunx,Qt,Python,人工智能