第二章为基本概率,所以直接进入第三章《数据》:
1.字符声明的两面性
我们在申明变量类型时,若未显性申明signed or unsigned,此时不同的编译器会自动申明为不同的类型。
若我们显性声明signed char or signed int 可以提高程序的可移植性,确保不同机器处理时,保证相同的效果。
但反之,不用的机器在处理signed 和unsigned的效率不同,若硬性申明,效率可能会受损,甚至可能有数据兼容性问题。
因此有时未必是上策
2.关于const关键字
在声明变量时,如果变量的值不会改变,也可以使用改关键字,让你的意图在其他阅读改程序时更清晰的展现,且当这个值意外被改变时,编译器能够发现这个问题。所以 const 并非只是特定的去限定变量
3.链接属性
链接属性分为external(外部),internal(内部)和none(无)
external: 无论声明多少次,位于几个源文件都属于同一个实体。
internal: 在同一源文件中所有声明指向同一实体,但位于不同源文件的多个声明则属于不同实体。
none:完全独立的个体
在未定义(缺省)的情况下,原型作用域(prototype scope)和代码块的变量之外的均为external,还有在代码块内但为函数名的变量也是external
例如:
tpedef char*a
int b;
int c(int d)
{
int e;
int f(int g);
}
其中 b,c,f均为external,a属于文件内定义的变量肯定不是external
当我们需要internal属性时,直接加上关键字static即可。
当使用extern来对标识符第一次声明时,它指定该标识符具有external链接属性,但是当它用于第二次及以后的声明时,它不会改变第一次声明指定的链接属性(即后面使用关键字static时,链接依然是external)
4.储存类型
一共有三个地方可以储存变量:普通内存,运行时堆栈,硬件寄存器。
1.静态变量
任何在代码块之外的声明变量总是储存于静态内存中,即不属于堆栈的内存,称为静态(static)变量。这类变量在程序整个执行期间一直存在。
2. 自动变量
代码块中内部声明的缺省变量是自动变量,储存于堆栈中,关键词auto用于表示该变量。自动变量在代码块执行时产生,结束时销毁。当代码块被重复执行时,与原来变量储存的位置不一定相同。
3.register(寄存器)
register可以用来申明自动变量,让数据储存于寄存器访问起来效率更高。但是当register申明过多时,编译器不一定会理睬该关键字,只会选取几个实际储存与寄存器中,其余的正常处理,甚至编译器会有自己的寄存器优化方法
5.static关键词
static关键词在不同的环境下会产生不同的效果,因此在这里总结一下
1.当用于函数定义时,或代码块之外的变量声明时,static用于修改链接属性,从external改为internal。但储存类型和作用域不受改变。
2.当用于代码块内部的变量声明时,static用于修改变量的储存类型,从自动变量改为静态