zoukankan      html  css  js  c++  java
  • C语言探索之旅 | 第一部分第五课:变量的世界(二),变量声明

    作者 谢恩铭,公众号「程序员联盟」。
    转载请注明出处。
    原文:https://www.jianshu.com/p/8db33987cb49

    《C语言探索之旅》全系列

    内容简介


    1. 变量是什么?
    2. 给变量起个名字
    3. 变量的类型
    4. 声明变量
    5. const 关键字
    6. 第一部分第六课预告

    1. 变量是什么?


    上一课我们学习的是 C语言探索之旅 | 第一部分第四课:变量的世界(一),内存那档事。相信我,上一课对于内存的初探绝对很有用。这一课我们一起来学习变量的声明。

    简单地说,变量就是暂时储存在内存中的一小段信息

    为什么叫做变量呢?

    变量的英语是 variable,做形容词用的话是“可变的,易变的”之意,所以变量就是在程序运行期间其值可以改变的量。

    你将会看到,我们写的程序,常常是充满变量的。

    在 C语言中(大多数语言也是如此),一个变量有两部分:

    • 变量的值:变量所储存的值,比如 5。
    • 变量的名字:是用来标识一个变量的。对于学了上一课有些担心是否需要用内存地址值作为变量的朋友,不用怕,在 C语言中,我们不用地址值作为变量名字,我们只需要给它取个名字,编译器会负责把这个名字转换成内存地址值,是不是感觉松了一口气?

    2. 给变量起个名字


    在 C语言中,每一个变量必须要有一个名字。我们可不能随便取名字,还要遵守一些限制条件:

    • 只能包含英文的大小写字母,数字和下划线(_),其他一律禁止。
    • 必须以字母开头。

    以下是一些正确的变量名:

    dog,cat_and_mouse,Catch_1_mouSe,hao123COM

    还要记得的是,C语言对大小写敏感,所以,hello 和 Hello 是两个不同的变量名。

    每一个程序员都有自己命名变量的习惯,我来说说本课程的变量命名习惯吧:

    • 变量名都以小写字母开头。
    • 如果变量名有好几个单词组成,那么除了第一个单词的首字母小写之外,其他单词的首字母都大写。

    希望大家在之后的练习题中也能尽量保持一致的命名习惯(其实这是比较通用的命名法)。

    命名变量时,尽量使之清晰易懂,如果我把一个变量 petName(表示是“宠物名字”)缩写为 pN,虽然短小精悍,但是阅读代码的人肯定猜不出来是什么意思。

    我们要尽量做到代码是可以“自注释”的,就是说光看变量名就可以知道这个变量的用途,很多时候就可以省略注释了。

    3. 变量的类型


    我们的电脑兄,其实是一台笨笨的机器,只知道计算,只能处理数字。

    但是,在 C语言当中,数字却有好多类型:

    • 正整数,如 2,49,186,6715。
    • 含有小数点的正数,如 3.14159,27.62,80.19732。
    • 负整数,如 -7,-999,-4321。
    • 含有小数点的负数,如 -6.753,-78.46,-5641.73。

    怎么有这么多乱七八糟的类型啊,可怜的电脑兄需要帮助...

    所以,当你要求电脑储存一个数字时,需要给出类型。倒并不是说电脑没办法区分,而是为了电脑能更好地规划,也为了不占用多余的内存。

    因此,在 C语言中,当我们声明一个变量时,必须要给出变量类型。

    下表列出了主要的一些类型:

    类型名 最小值 最大值
    signed char -128 127
    int -32768 32767
    long -2147483648 2147483647
    float -1 x 10^37 1 x 10^37
    double -1 x 10^37 1 x 10^37

    注意:上面列出的数据是 C语言所保证的最小的取值范围。实际上,你往往可以在上述类型中存放更大的数值。
    例如,这里的 int 保证最小取值范围是 -32768 到 32767,是针对 2 字节大小的 int 型来说的。一般现在的 32 位或 64 位操作系统里 int 是 4 字节,取值范围是 -2147483648 到 2147483647。

    不过,最好能稍微记得上表中的值,对你正确选择变量类型有帮助。

    当然 C语言还有其他的变量类型,上表只是列出了常用的。

    下面给出 C语言所有变量类型:

    C语言所有变量类型

    之前的表格中前三种类型(signed char,int,long)用于声明整数。如:6,74,8931,等。

    后两种类型(float,double)用于声明浮点数(包含小数点的数)。如:7.64,61.467,等。

    之后的课程你会看到整数用得最多,因为简单易用。

    说一下 signed 和 unsigned 的区别:signed 就是有符号的,就是最开始有正号或者负号(正数或负数),如 7,-5,9.2,-23.8,等。unsigned 是无符号数,只能是正数或零,如 35,7461,61.789,等。

    所以 signed int 就是有符号整数,unsigned int 是无符号整数。依此类推。

    signed 和 unsigned 放在 int,long,char,float,double 等类型的前面。

    类型名 最小值 最大值
    unsigned char 0 255
    unsigned int 0 65535
    unsigned long 0 4294967295

    上面的表格中,我们可以看到,unsigned 类型不能储存负数,但是相比 signed 类型的优势是可以储存两倍于 signed 类型的最大值,例如 signed char 最大值是 127,unsigned char 最大值是 255。

    char 实际上也可以看成是一种整型(这样说可能有点错误),因为每个字符的编码实际上也是用整型编的(可以查 ASCII 码表)。如果你将它强行转换为整型,是可以转的。很多时候,我们都会将 char 转成整型来计算或比较,举个例子,'A'(大写字母 A)对应 65。

    为什么对于整数,之前的表里面列出了三种类型:char,int,long 呢?一种不够吗?

    是这样的,C语言最初创建多种整数类型的目的是为了节约内存。如果我们声明一个 char 类型的变量,相比于 int 类型,电脑所使用的内存空间就要小。

    当然了,在内存很有限的那个年代(“遥想公瑾当年,小乔初嫁了...”),多种整数类型很有用。今天,我们的电脑有相当多的内存(“俱往矣,数风流人物,还看今朝~”),所以一般已经不需要捉襟见肘地声明变量了。不过,对于内存有限的嵌入式的某些应用,还是需要谨慎地使用整数类型。

    做个小结:

    • 对于整数,一般用 int。
    • 对于浮点数,一般用 double。

    4. 声明变量


    做了这么多铺垫,终于到了我们的主题了。现在,创建一个新的控制台项目,就取名叫 Variable 吧。

    我们一起来学习如何声明变量,也就是请求电脑分配一些内存空间给我们使用。

    声明变量其实很简单,你应该知道怎么做了。只需要按照下面的顺序:

    1. 写上我们要创建的变量的类型。
    2. 空一格。
    3. 写上你给变量取的名字。
    4. 最后,不要忘了加上分号。

    比如,我可以这样声明一些变量

    int growthOfEconomy;
    double averageSalary;
    unsigned int numberOfDogs
    

    以上我们所做的被称为“变量声明”,请记住这个术语。你应该在函数的开始声明变量。既然我们目前只有一个函数:main 函数,我们就这样声明一个变量:

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(int argc, char *argv[])
    {
        int numberOfDogs;
    
        return 0;
    }
    

    如果你运行上述程序,你会惊讶的发现:这个程序貌似啥也没干。

    一些解释


    好了,在你要指控我欺骗你之前,容我辩解一下:

    事实上,这个程序是干了一些事情,只不过你看不到。当程序读到变量声明那一行时,它很有礼貌地询问电脑是否可以用一些内存空间。

    如果一切顺利,电脑会回答“好的,没问题,拿一些内存空间去吧”。通常来说,是会顺利进行的。所以你的变量一般来说(除非内存不够了,但是很少会这样,因为你只是要求分配一个 int 的空间,很少的)肯定创建了。

    一个小“技巧”:如果你有好几个同一类型的变量要声明,没必要每一个变量的声明都写一行,你可以都写在一行上,例如:

    int numberOfDogs, numberOfCats, numberOfMouses;
    

    就同时声明了三个 int 类型的变量:numberOfDogs,numberOfCats,numberOfMouses 。

    然后呢?

    既然我们已经声明了变量,那我们接下来可以给变量赋一个值。

    没有比这更简单的了。如果你要给上面的变量 numberOfDogs 赋值,只要这样写

    numberOfDogs = 7;
    

    不用做什么其他的了。你写上变量名,然后写一个等号,接着写你要给它的值。

    上面,我们刚把 7 赋给了 numberOfDogs(表示“狗的数目”)。

    因此,我们的完整程序现在是这样的:

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(int argc, char *argv[])
    {
        int numberOfDogs;
        numberOfDogs = 7;    // 有七条狗
    
        return 0;
    }
    

    这次你如果运行一下,也没有发生什么,屏幕上什么也没显示。但其实一切都悄然在内存中进行,只不过你看不到罢了。

    在你电脑深处的某个地方,一小块内存上刚储存了 7 这个值。是不是很神奇呢?

    我们可以试着改变变量的值,比如像这样:

    int numberOfDogs; 
    numberOfDogs = 7;
    numberOfDogs = 6;
    numberOfDogs = 5;
    

    上述例子中,numberOfDogs 这个 int 类型的变量首先会被赋值为 7,之后改为 6,再改为 5。因为你的电脑运算速度太快,所以这一系列操作都是瞬间就完成了。还没来得及眨眼,你的变量 numberOfDogs 的值就从 7,变为 6,再变为 5。

    新的变量的值


    现在来看一个很重要的问题:当我们声明一个变量时,它的初始值是多少呢?

    实际上,当电脑读到这一行:

    int numberOfDogs;
    

    首先,它在内存中取了一小块出来给 numberOfDogs 用。但是这时 numberOfDogs 的值是多少呢?有没有一个默认值(比如 0)呢?

    答案是:没有。

    没有默认值。事实上,内存的这小块区域是给了 numberOfDogs,但是上面的值并没有改变,我们并没有清空在这小块内存上原来有的值。所以,你的变量 numberOfDogs 的初始值就是在那一小块内存上的值,这个值可以是任意的。

    如果这块内存的值先前没有改变过,那可能是 0。

    你并不能确定,有可能初始值是 45 或 182,因为可能之前有一个程序已经改变了那块地址上的值。

    所以要小心,最好的解决方案是当你声明变量时,同时为它赋一个初值:

    int numberOfDogs = 7;
    

    这里,int 型变量 numberOfDogs 被声明,并且立即被赋值为 7。

    这样做的好处是:你可以确定这个变量的值是什么,不会是任意的一个数。

    5. const 关键字


    有时我们想要使用一个变量,我们又希望它的值在程序中保持不变。就是说,一旦声明,你希望你的变量就保持它的初始值,没有人能更动它。

    这种特殊的变量被称为 constant(表示“恒定的,不变的”)变量,由 const 关键字修饰。

    有的书本说 const 修饰的是常量,这种说法是不准确的。const 修饰的是变量,只不过是只读的变量。因为加上 const 之后,值就不能再改变了。

    如何声明一个 constant 变量呢?很简单:

    只要把 const 关键字放在你的变量的类型前面(放在后面也是可以的),此外,声明 constant 变量时,必须给它赋初值!

    例如:

    const int NUMBER_OF_DOGS = 7;
    

    并不是一定要大写 const 变量的名字,只是一般用大写,这已经成为了一个约定俗成的习惯。

    除了值不能改变,const 变量和一般变量一样。只不过假如你要在之后的程序中改变 const 变量的值,编译器会提示一个错误,例如:

    [Warning] assignment of read-only variable 'NUMBER_OF_DOGS'
    (表示“[警告] 试图改变只读变量 NUMBER_OF_DOGS 的值”)
    

    6. 第一部分第六课预告


    今天的课就到这里,一起加油吧!

    下一课:C语言探索之旅 | 第一部分第六课:变量的世界(三),显示变量内容


    我是 谢恩铭,公众号「程序员联盟」运营者,慕课网精英讲师 Oscar 老师,终生学习者。
    热爱生活,喜欢游泳,略懂烹饪。
    人生格言:「向着标杆直跑」

  • 相关阅读:
    JS 中 this 关键字详解
    Excel 文本函数
    Excel 日期和时间函数
    Excel引用和数学函数
    Excel-查找函数
    Excel-统计函数
    数据分析-业务知识
    Excel-逻辑函数
    Excel-基本操作
    电商数据分析总结
  • 原文地址:https://www.cnblogs.com/frogoscar/p/12967263.html
Copyright © 2011-2022 走看看