不一样的C语言-变量

2019-07-13 08:31发布

变量

  笔者是一名正在步入嵌入式Linux的程序猿。在巩固C语言之余,笔者认为有必要将其整理成一系列的文章。遐思片刻,为本系列文章取名《不一样的C语言》。不一样的C并不是说笔者所整理的C非STDC(标准C),而是笔者抛开C语言书籍,根据自己的认识所写的C语言系列文章。也许入C未深的我,对于一些概念有错误的理解,望网名能够多多包涵和指正。话不多说,下面马上开篇!   有一个公式:数据结构 + 算法 = 程序。对于面向过程的C语言来说,显然这是正确的。实现 {MOD}彩斑斓的程序的画笔,正是它--变量。 

一、变量是什么

  顾名思义,变量就是在程序执行过程中可以根据需要变化的量。一说到变量,大多数C语言初学者脑子里浮现的是int,char,float...你们的反射也并没有什么不妥,因为你们把变量和类型深深的绑定到了一起。而笔者脑子里浮现的是一段抽象化的存储空间。我们先从变量的定义谈起。   定义一个变量的格式:类型 变量名   从语法我们知道,定义一个 变量,我们首先要知道变量是什么类型,然后为这个变量其一个合适的名字。不知道你们会不会感觉奇怪,为什么我们要写类型,至少笔者是敏感的。   在说出笔者的敏感之前,我们先来了解一下强类型语言和弱类型语言。C语言是强类型语言(当然C++/JAVA都是),PHP、JavaScript等绝大部分脚本语言是弱类型语言。那么强和弱的区别在哪里?区别之一就是:强类型语言在定义变量的时候需要指出变量的具体类型,而弱类型语言则显得简单了,PHP直接 $变量名,JavaScript直接 var 变量名。笔者敏感的正是类型,在定义一个变量的时候,我们指明了变量的类型,也正是因为如此编译器知道了如何去给我们在存储空间中申请符合我们类型大小的空间,然后把他的操作入口给变量名。打个比方,变量名就是一把钥匙,而他真正打开的是一所符合我们家庭大小的房子(当然你可以通过手段越界)。   我们再回过头来思量变量,这时的你也许就不会出现int,char,float...出现的是一段存储空间,然后根据变量的类型来确定我们需要如何解释这段空间。到此,笔者重新给变量一个定义:变量是一段用特殊方法解释的可用供程序员修改的存储空间。

二、从unsigned类型修饰符谈变量

  众所周知,C语言数据类型分为:基本数据类型,复合数据类型(构造类型),空类型(void)。对于基本数据类型又可以细分为整形和浮点型。不知读者是否又真正思考过,整型和浮点型除了占用内存字节数有所差异意外,有什么不同。搞清楚这里面的奥秘,我们首先从设计C语言本身的角度来思考,为什么需要区分整型和浮点型。整形所要表达的是整数,浮点型所要表达的是小数。我们知道,计算机内存中只能存储二进制的0和1,那么这么有限的符号如何来表达整数和小数呢?C语言的设计者将整数的表达和小数的表达单独列了出来。下面我们来谈一谈整形和浮点型在内存中是如何规定的,以32位机器为例。   整形分为:int,short int,long int,long long int。其对应机器是多少字节这里不作详细的介绍。我们以int为例来看看在内存中是如何规划的。首先我们应该知道的是整形分为有符号和无符号,定义的时候没有加上unsigned修饰符则默认为有符号。接下来我们看看有符号的int在内存中如何分布。
31~24 23~16 15~8 7~0 最高位31,是符号位,0表示正数,1表示负数。其余31个位是数据位。所以int的取值范围是 -2^31 ~ 2^31 -1。对于unsigned int那就更简单了32个位全部都是数据位,所以unsigned int的取值范围 0~2^32-1。   举上面的例子,并不是正真的想告诉你们整型在内存中是如何分布的,也许如何分布你们已经滚瓜烂熟。举这个例子,是想举一反三的告诉大家,变量的类型,无非就是C语言的设计者事先规定好的如何对一段已知的存储空间存和取,当然存很多时候不需要我们插手。这要我么把这一点摸透,那么变量类型在我们的眼里就是纸老虎。

三、从变量的类型转换谈变量:

  C语言中,类型转换可以分为隐式转换和显式转换(强制转换)。隐式是编译器帮我们做的,我们并不需要关心。但倘若真不关心,则会出错。说到类型转换,笔者要拿一个简单的例子来加以阐述: char c = 'a'; int i = c;
打印 i 的值,则为97,这是安全的转换,因为int的内存空间足够装下char。下面我们反过来:
int i = 255; unsigned char c = (char)i;
按照int的类型来打印c,结果是255,这看起来并没有什么不妥,但是这是不安全的,如果是256此时就会溢出了。 这两个例子,可能对读者的启发并不大。但是我们看内存的角度来看看这两次转换,之所以能够成功,是因为,变量真的只是一段可以存储数据的空间而已,没有那么神奇,他只是冷冰冰的0和1,你想对其操作(即使是不安全的)都是能够为所欲为的,但是由于存储大小和规则的不同,带来的数据安全问题就要由程序员自己考虑,是把双刃剑。

总结:

  写到这里,笔者认为对于变量的初步探究到此就可以收尾了。让读者清楚的认识到变量的本质,然后通过大量的编码去体会变量,才能真正体会到本文中对于变量的阐述。JAVA中一切皆对象,C语言中,一切皆内存。如果你能体会这句话,你就开始步入C语言了。
下一篇文章:不一样的C语言-auto,register,static,extern