
C 词汇中的URL却是挺多的,比如说时常看的类别URL,如 int、char、float、struct、union、enum等;推论内部结构和循环式内部结构的URL,if、else、for、while之类;除了类型表述URL typedef。
第一集该文来和我们来如是说 const 和 register URL。这三个又叫作缩排,用以润色表达式的,让一般的表达式造成特定的象征意义。
1. const
const 意为自表达式,在C词汇中则表示为自表达式缩排。
当三个表达式所带 const URL,所以那个表达式就成了三个自表达式。
自表达式是不容更动的表达式,即在一已经开始表述后,就不容以再间接修正了。且自表达式在表述的与此同时要是展开调用,不然是严重错误的。
比如,将三个表达式 a 透过 const 表述为自表达式,并给它调用三个值 1。前面想透过表达式操作符来修正自表达式 a 的值,就无法了。

所以,自表达式的值就一定无法修正吗?
也不一定,C 词汇中有三个二五仔,指针。你说不容能的事,我偏偏要是把它变成可能。

运行结果:自表达式a的值1 自表达式a的值99
需要注意的是,当将自表达式 a 的地址赋给指针表达式 pa 时,必须使用类别强转。因为在 C 词汇当中,认为 const 是更广泛的类别限制,优先级更高。
2. register
register 直译为注册、记录,在程序中则表示为寄存器表达式缩排。与此同时也是四种表达式存储类的其中三个。
它的作用是暗示编译器那个表达式有可能会被频繁地用到,建议把它放到寄存器里面,从而提高运行速率。
那什么是寄存器?寄存器是CPU中用以暂时存储数据的三个小型存储区域,和缓存、内存、硬盘一样都是用以存储数据的。
关于这四个的运行速度,互相之间的关系,有三个比喻我觉得有趣,但或许不所以恰当。
CPU 相当于是皇帝,寄存器相当于大内总管,缓存相当于大臣,内存相当于地方官员,硬盘相当于平民百姓。
平民百姓需要将紧急民情上达到地方官员。
地方官员整理成册,写成紧急奏折送到皇城里。
皇城里的大臣收到了地方官员的紧急奏折,再转交给大内总管,让他交给皇帝处理。
但有时候因为民情太严重了,地方官员就间接上交给大内总管,让大内总管间接交给皇帝。

由此能知道,寄存器的处理速度是最快,硬盘是最慢的。
使用寄存器需要注意以下内容:
2.1 寄存器表达式的类别应该是CPU所能接受的数据类别。
这就意味着,寄存器表达式必须是三个单个的值,并且长度应该小于或者等于整型的长度。因此,建议用 register 去润色如 short、char、int 等比较小的数据类别。
不过,现在有些机器的寄存器也是能存放浮点型的。
2.2 无法对寄存器表达式使用 &。
因此无法对寄存器表达式使用寻址操作符(&),不然运行后会造成报错。

2.3 只有局部表达式和形参能作为寄存器表达式。
局部表达式和形参都有三个特性,那是生命周期短,完成相关内容后,就结束了他们的使命,这一点寄存器就非常的喜欢。
寄存器是 CPU 中一小块的存储区域,因此能说这里的空间都是寸土寸金。寄存器的存在是为了提高程序的运行效率,所以这里空间一般都是留给那些需要反复、频繁使用的数据。
如果是全局表达式这种与天(程序)同寿的家伙放到寄存器,所以寄存器的空间就相当于默认舍弃掉一部分,这对于寄存器而言,是无法容忍的。
2.4 局部静态表达式也无法作为寄存器表达式。
在 C 词汇当中,表达式的存储类别只能使用三个。因此 register 和 static 是无法放在一起共用的。

这是因为 static 所润色的表达式,称之为静态表达式。
静态表达式的生命周期和全局表达式是一样,如果放在寄存器中,也是白白浪费了一块地方。
2.5 寄存器的数量是有限的的。
所以一些寄存器只接受特定类别的数据,比如说指针或者浮点型。如果过多地使用 register 来展开润色,编译器会自动将多余的 register 缩排展开忽略。
除了最后三个问题,register 润色的表达式就一定是存放在寄存器中的吗
不一定。
在过去,C 词汇编译器是不会将表达式存储在寄存器中, register 的出现是非常有价值的。
但如今,随着编译器越来越强,register 的作用是暗示和建议,请求尽可能地将声明的表达式放在寄存器中,并无法做出最终的拍板。
现在即便不使用 register 缩排,强大的编译器也会自动识别哪些表达式是需要放到寄存器当中。而有时候就算所带了 register 缩排,编译器也会自动忽略,把它看做是三个一般的表达式。
最后
以上是关于 C 词汇 const 和 register 缩排的如是说。
