1.1,最宽恒大量的关键字----auto

auto:你就当它不存在吧。编译器在默认的缺省情况下,所有变量都是auto的。

 

1.2,最快的关键字---- register

register:这个关键字请求编译器尽可能的将变量存在CPU内部寄存器中而不是通过内

存寻址访问以提高效率。注意是尽可能,不是绝对。你想想,一个CPU的寄存器也就那么

几个或几十个,你要是定义了很多很多register变量,它累死也可能不能全部把这些变量放

入寄存器吧,轮也可能轮不到你。

1.2.1简讲寄存器

数据从内存里拿出来先放到寄存器,然后CPU再从寄存器里读取数据来处理,处理

完后同样把数据通过寄存器存放到内存里,CPU不直接和内存打交道

一个CPU也可以有很多寄存器,不同型号的CPU拥有寄存器的数量不一样。

寄存器其实就是一块一块小的存储空间,只不过其存取速度要比内存快得多。它离CPU很近,CPU一伸手就拿到数据了,比在那么大的一块内存里去寻找某个地址上的数据是不是快多了?那有人问既然它速度那么快,那我们的内存硬盘都改成寄存器得了呗。我要说的是:你真有钱!

1.2.2,使用register修饰符的注意点

虽然寄存器的速度非常快,但是使用register修饰符也有些限制的:

register变量必须是能被CPU寄存器所接受的类型。意味着register变量必须是一个单个的值,并且其长度应小于或等于整型的长度。

而且register变量可能不存放在内存中,所以不能用取址运算符“&”来获取register变量的地址。

 

 

1.3,最名不符实的关键字----static

不要误以为关键字static很安静,其实它一点也不安静。这个关键字在C语言里主要有

两个作用,C++对它进行了扩展。

1.3.1,修饰变量

第一个作用:修饰变量。变量又分为局部和全局变量,但它们都存在内存的静态区。

静态全局变量,作用域仅限于变量被定义的文件中,其他文件即使用extern声明也没法

使用他。准确地说作用域是从定义之处开始,到文件结尾处结束,在定义之处前面的那些

代码行也不能使用它。想要使用就得在前面再加extern***。恶心吧?要想不恶心,很简单,

直接在文件顶端定义不就得了。

静态局部变量,在函数体里面定义的,就只能在这个函数里用了,同一个文档中的其他

函数也用不了。由于被static修饰的变量总是存在内存的静态区,所以即使这个函数运行结

束,这个静态变量的值还是不会被销毁,函数下次使用时仍然能用到这个值

1.3.2,修饰函数

第二个作用:修饰函数。函数前加static使得函数成为静态函数。但此处“static”的含义

不是指存储方式,而是指对函数的作用域仅局限于本文件(所以又称内部函数)。使用内部函

数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件

中的函数同名。

1.5,最冤枉的关键字----sizeof

 inti=0;(32位系统下测试)

A),sizeof(int);B),sizeof(i);C),sizeof int;D),sizeof i;

毫无疑问,32位系统下A),B)的值为4。那C)的呢?D)的呢?

通过调试得知D的结果也为4

没有括号居然也行,那想想,函数名后面没有括号行吗?由此轻易得出sizeof绝非函数。

而C  sizeof int是神马啊int前面加一个关键字?类型扩展?明显不正确

我们可以在int前加unsigned,const等关键字但不能加sizeof。好,记住:

sizeof在计算变量所占空间大小时,括号可以省略,而计算类型(模子)大小时不能省略。

一般情况下咱也别偷懒,乖乖的写上括号,继续装作一个“函数”做一个“披着函数皮的关键字”做我的关键字,让人家认为是函数去吧。

 1.6,signed、unsigned关键字

 我们知道计算机底层只认识0、1.任何数据到了底层都会变计算转换成0、1.那负数怎么

存储呢?肯定这个“-”号是无法存入内存的,怎么办?很好办,做个标记。把基本数据类

型的最高位腾出来,用来存符号,同时约定如下:

最高位如果是1,表明这个数是负数,其值为除最高位以外的剩余位的值添上这个“-”号;

如果最高位是0,表明这个数是正数,其值为除最高位以外的剩余位的值。

这样的话,

 

一个32位的signed int类型整数其值表示法范围为:-2(31)~2 (31)-1;

8位的char类型数其值表示的范围为-2(7)~2 (7)-1;

 

一个32位的unsigned int类型整数其值表示法范围为:-2(32)~2 (32)-1;

8位的char类型数其值表示的范围为-2(8)~2 (8)-1;

 

同样我们的signed关键字也很宽恒大量,你也可以完全当它不存在,

编译器缺省默认情况下数据为signed类型的。