1.变量名大小写有区别;对于内部名称而言至少前31个字符是有效的,函数名与外部变量名包含的字符数目可能小于31。
2.int 通常反映了所用机器中整数的最自然的长度;
signed与unsigned可用于限定char类型或任何整型;unsigned类型的数总是正值或0,遵守2的n次幂定律,n为所占位数,例如,char对象8位,unsigned char取值范围0到255,signed char取值范围-128到127。
3.算术运算符,优先级* / % 高于+ -
关系运算符,优先级> >= < <= 优先级高于 == !=
逻辑运算符,优先级&&高于||,从左到右求值,知道结果后立即停止计算
优先级:算术>关系>逻辑
4.类型自动转换是指把“比较窄的”操作数转换为“比较宽的”操作数;
不同类型的操作数进行二元运算前,较低的类型会被提升为较高的类型。
5.位运算
& 按位与(AND),| 按位或(OR),^按位异或(XOR),<< 左移,>>右移,~按位求反
&经常用于屏蔽二进制为,例如:n=n&0177,将n中除了7个低位二进制位外其他各位置为0。
|常用于将二进制位置为1,例如:x=x|SET_ON,将x中对应SET_ON中为1的二进制位置为1。
^当两个操作数的对应位不相同时置为1,否则0。
<<,>>,x<<2将x左移2位,右边空出2位0填补,等价于操作数乘以4。
unsigned类型无符号值右移时,左空位用0填补;signed有符号值右移时,某些机器左空位符号位填补,有些0填补(即逻辑移位)。
一元运算符~用于求整数的二进制反码,各位1变0,0变1。
在任何一种编程语言中,如果代码的执行结果与求值顺序相关,则都是不好的程序设计风格。
6.switch语句可使用的数据类型有,int、char、bool、枚举。
7.作用域,如果在外部变量的定义之前使用该变量,或者外部变量的定义与变量的使用不在同一个源文件,则必须在相应的变量声明中强制性地使用关键字extern。将外部变量声明与定义区分很重要。变量声明用于说明变量属性,变量定义出此以外还将引起存储器的分配。
定义外部变量
int sp;
double val[MAXVAL];
声明外部变量
extern int sp;
extern double val[];
在一个或所有源文件中,一个外部变量只能在某个文件中定义一次,而其他文件可以通过extern声明来访问它(定义外部变量的源文件也可以包含对该外部变量的extern声明)。定义中必须指定数组的长度,但extern声明则不一定。
外部变量的初始化只能出现在其定义中。
8.静态变量,所在源文件公用,防止外部文件用。static类型的内部变量是一种只能在某个特定函数中使用但一直占据存储空间的变量。
9.寄存器变量,register声明告诉编译器该变量使用频率较高,将其放在机器的寄存器中,这样使程序更小,执行更快,但编译器可以忽略此选项。
register声明只适用于自动变量以及函数的形式参数。下面是后一种情况例子:
f(register unsigned m, register long n)
{
register int i;
...
}
过量的寄存器声明没有害处,因为编译器可以忽略过量的或不支持寄存器变量声明。另外,无论寄存器变量实际上是不是存放在寄存器中,它的地址都是不能访问的。
自动变量,只在定义它们的时候才创建,存储空间的分配和回收是由系统自动完成的,一般情况下,不作专门说明的局部变量均是自动变量,也可用auto做出说明。
10.初始化,在不进行显示初始化的情况下,外部变量和静态变量都将初始化为0,而自动变量和寄存器变量的初值则没有意义(即初值为无用的信息)。
对于外部变量与静态变量来说,初始化必须是常量表达式,且只初始化一次。
如果初始化表达式的个数比数组元素少,则对外部变量、静态变量和自动变量来说,没有初始化的元素为0,如果多,错误。不能一次将一个初始化表达式指定多个数组元素。
11.递归并不节省存储器的开销,必须在某个地方维护一个存储处理值得栈,执行速度并不快,但代码紧凑易于理解。
12.两个最常用的预处理器指令是:#include指令(用于在编译期间把指定文件的内容包含进当前文件中)和#define指令(用任意字符序列替代一个标记)。
#include "文件名" 在源文件所在位置查找文件,如果在该位置没找到则根据相应规则查
#include <文件名> 直接根据相应规则查找文件,规则与具体的实现有关。
带参数的宏定义
#define max(A,B) ((A) > (B)) ? (A) : (B)
x = max(p+q, r+s); 将被替换为 x = ((p+q) > (r+s) ? (p+q) : (r+s));
缺陷,参数的表达式重复计算了两次
max(i++, j++) //错误 对参数执行了两次自增操作
要适当使用圆括号以保证计算次序的正确性
#define square(x) x*x
square(z+1)就会变成 z+1*z+1 错误。
#undef指令取消宏定义。
为了保证头文件的内容只被包含一次,避免多次包含,用户这样就不必考虑处理头文件之间的各种依赖关系了。
#ifndef HDR //或者写成if !define(HDR)
#define HDR
...
#endif
预处理运算符##为宏扩展提供了一种链接实际参数的手段,##与前后的空白符将被删除,并对替换后的结果重新扫描,例如:
#define paste(front, back) front ## back
paste(name,1) 结果为:name1
福利提神
来点鸡汤~
这人们看人的时候,其实手里都有个望远镜。要把人看得高大,就拉近了看,可要是预先存了轻蔑之想,就好像把手里的望远镜颠倒了看。那里面的人原本再高大,也不过是一根叉开两腿的小萝卜。