C语言探索之旅 | 第一部分第五课:变量的世界(二),变量声明

摘要:
在上一课中,我们学习了C语言探索之旅|第一部分第4课:变量的世界(I),记忆。在C中,变量有两部分:变量的值:存储在变量中的值,例如5。因此,在C语言中,当我们声明变量时,必须给出变量类型。C语言的所有变量类型如下:上表中的前三种类型用于声明整数。例如,我可以这样声明一些变量intgrowthOfEconomy;双倍平均工资;我们上面所做的叫做“变量声明”。请记住这个术语。

C语言探索之旅 | 第一部分第五课:变量的世界(二),变量声明第1张

作者 谢恩铭,公众号「程序员联盟」。
转载请注明出处。
原文: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-128127
int-3276832767
long-21474836482147483647
float-1 x 10^371 x 10^37
double-1 x 10^371 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 char0255
unsigned int065535
unsigned long04294967295

上面的表格中,我们可以看到,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 老师,终生学习者。
热爱生活,喜欢游泳,略懂烹饪。
人生格言:「向着标杆直跑」

免责声明:文章转载自《C语言探索之旅 | 第一部分第五课:变量的世界(二),变量声明》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇微信小程序----团购或秒杀的批量倒计时实现MYSQL 命令行工具自动登录的方法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

elementui源码解析markdown处理

一些参考网址: markdown-it官网:markdown-it | markdown-it 中文文档 (docschina.org) markdown-it插件的分析和源码分析参考地址:https://zhuanlan.zhihu.com/p/64290806 参考例子:https://gitee.com/springliuliu/mdToHtm...

PHP中的全局变量global和$GLOBALS的区别

1.global Global的作用是定义全局变量,但是这个全局变量不是应用于整个网站,而是应用于当前页面,包括include或require的所有文件。 但是在函数体内定义的global变量,函数体内可以使用,在函数体外定义的global变量不能在函数体内使用,具体看下面示例。 (1)在函数体内定义global变量,函数体内可以使用。 <?php...

INNO Setup 使用笔记

INNO Setup 使用笔记[Setup] AppName={#MyAppName} AppVerName={#MyAppVerName} AppPublisher={#MyAppPublisher} AppPublisherURL={#MyAppURL} AppSupportURL={#MyAppURL} AppUpdatesURL={#MyAppUR...

electron 不支持Ctrl+滚动条放大缩小,自己动手做了一个react组件

前言:功能是不难的,看过代码之后,肯定能理解,肯定。重点说明,这仅仅是为了electron打包做的需求,一般是不会有这样的需求,因为浏览器都带有这样的功能!!!说三遍!!说三遍!!说三遍!! ScrollBox.tsx import React, { useEffect, useRef, useState } from 'react' import { B...

libpcap编程实例

1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <pcap.h> 4 #include <errno.h> 5 #include <sys/socket.h> 6 #include <netinet/in...

C++20新特性

C++20新特性 新增关键字(keywords) concept requires constinit consteval co_await co_return co_yield char8_t 模块(Modules) 优点: 1)没有头文件; 2)声明实现仍然可分离, 但非必要; 3)可以显式指定导出哪些类或函数; 4)不需要头文件重复引入宏 (incl...