简单地说,变量就是暂时储存在内存中的一小段信息。
为什么叫做变量呢?
变量的英语是variable,做形容词用的话是“可变的,易变的”之意,所以变量就是在程序运行期间其值可以改变的量。
你将会看到,我们写的程序,常常是充满变量的。
在C语言中(大多数语言也是如此),一个变量有两部分:
在C语言中,每一个变量必须要有一个名字。我们可不能随便取名字,还要遵守一些限制条件:
以下是一些正确的变量名:
dog,cat_and_mouse,Catch_1_mouSe,hao123COM
还要记得的是,C语言对大小写敏感,所以,hello和Hello是两个不同的变量名。
每一个程序员都有自己命名变量的习惯,我来说说本课程的变量命名习惯吧:
希望大家在之后的练习题中也能尽量保持一致的命名习惯(其实这是比较通用的命名法)。
命名变量时,尽量使之清晰易懂,如果我把一个变量petName(表示是“宠物名字”)缩写为pN,虽然短小精悍,但是阅读代码的人肯定猜不出来是什么意思。
我们要尽量做到代码是可以“自注释”的,就是说光看变量名就可以知道这个变量的用途,很多时候就可以省略注释了。
我们的电脑兄,其实是一台笨笨的机器,只知道计算,只能处理数字。
但是,在C语言当中,数字却有好多类型:
怎么有这么多乱七八糟的类型啊,可怜的电脑兄需要帮助...
所以,当你要求电脑储存一个数字时,需要给出类型。倒并不是说电脑没办法区分,而是为了电脑能更好地规划,也为了不占用多余的内存。
下表列出了主要的一些类型:
注意:上面列出的数据是C语言所保证的最小的取值范围。实际上,你往往可以在上述类型中存放更大的数值。例如,这里的int保证最小取值范围是-32768到32767,是针对2字节大小的int型来说的。一般现在的32位或64位操作系统里int是4字节,取值范围是-2147483648到2147483647。
不过,最好能稍微记得上表中的值,对你正确选择变量类型有帮助。
当然C语言还有其他的变量类型,上表只是列出了常用的。
下面给出C语言所有变量类型:
之后的课程你会看到整数用得最多,因为简单易用。
说一下signed和unsigned的区别:signed就是有符号的,就是最开始有正号或者负号(正数或负数),如7,-5,9.2,-23.8,等。unsigned是无符号数,只能是正数或零,如35,7461,61.789,等。
所以signedint就是有符号整数,unsignedint是无符号整数。依此类推。
signed和unsigned放在int,long,char,float,double等类型的前面。
上面的表格中,我们可以看到,unsigned类型不能储存负数,但是相比signed类型的优势是可以储存两倍于signed类型的最大值,例如signedchar最大值是127,unsignedchar最大值是255。
char实际上也可以看成是一种整型(这样说可能有点错误),因为每个字符的编码实际上也是用整型编的(可以查ASCII码表)。如果你将它强行转换为整型,是可以转的。很多时候,我们都会将char转成整型来计算或比较,举个例子,'A'(大写字母A)对应65。
为什么对于整数,之前的表里面列出了三种类型:char,int,long呢?一种不够吗?
做个小结:
做了这么多铺垫,终于到了我们的主题了。现在,创建一个新的控制台项目,就取名叫Variable吧。
#include
好了,在你要指控我欺骗你之前,容我辩解一下:
如果一切顺利,电脑会回答“好的,没问题,拿一些内存空间去吧”。通常来说,是会顺利进行的。所以你的变量一般来说(除非内存不够了,但是很少会这样,因为你只是要求分配一个int的空间,很少的)肯定创建了。
然后呢?
没有比这更简单的了。如果你要给上面的变量numberOfDogs赋值,只要这样写
numberOfDogs=7;不用做什么其他的了。你写上变量名,然后写一个等号,接着写你要给它的值。
上面,我们刚把7赋给了numberOfDogs(表示“狗的数目”)。
因此,我们的完整程序现在是这样的:
#include
在你电脑深处的某个地方,一小块内存上刚储存了7这个值。是不是很神奇呢?
我们可以试着改变变量的值,比如像这样:
intnumberOfDogs;numberOfDogs=7;numberOfDogs=6;numberOfDogs=5;上述例子中,numberOfDogs这个int类型的变量首先会被赋值为7,之后改为6,再改为5。因为你的电脑运算速度太快,所以这一系列操作都是瞬间就完成了。还没来得及眨眼,你的变量numberOfDogs的值就从7,变为6,再变为5。
实际上,当电脑读到这一行:
intnumberOfDogs;首先,它在内存中取了一小块出来给numberOfDogs用。但是这时numberOfDogs的值是多少呢?有没有一个默认值(比如0)呢?
答案是:没有。
没有默认值。事实上,内存的这小块区域是给了numberOfDogs,但是上面的值并没有改变,我们并没有清空在这小块内存上原来有的值。所以,你的变量numberOfDogs的初始值就是在那一小块内存上的值,这个值可以是任意的。
如果这块内存的值先前没有改变过,那可能是0。
你并不能确定,有可能初始值是45或182,因为可能之前有一个程序已经改变了那块地址上的值。
这样做的好处是:你可以确定这个变量的值是什么,不会是任意的一个数。
这种特殊的变量被称为constant(表示“恒定的,不变的”)变量,由const关键字修饰。
有的书本说const修饰的是常量,这种说法是不准确的。const修饰的是变量,只不过是只读的变量。因为加上const之后,值就不能再改变了。
例如:
constintNUMBER_OF_DOGS=7;并不是一定要大写const变量的名字,只是一般用大写,这已经成为了一个约定俗成的习惯。
除了值不能改变,const变量和一般变量一样。只不过假如你要在之后的程序中改变const变量的值,编译器会提示一个错误,例如:
[Warning]assignmentofread-onlyvariable'NUMBER_OF_DOGS'(表示“[警告]试图改变只读变量NUMBER_OF_DOGS的值”)