C语言基础——认识C语言(二)

2023-03-30 00:00:00 变量 定义 枚举 常量 标识符
序文
欢迎阅读  霖海岛LHaisland   原创的C语言合集的第二篇文章,本文字数为3649字,全文阅读需要约15分钟。由于笔者能力有限,如有疏漏或错误的地方,希望读者朋友们不吝斧正,谢谢大家。
对于上篇内容的补充:
上篇文章——认识C语言(一)
  • printf函数常用的输出格式(未来还会继续补充):

  • C语言的32个关键字:

数据类型关键字(12个):

char、short、int、long、signed、unsigned、float、double、struct、union、enum、void 

控制语句关键字(12个)

1、循环控制:for、do、while、break、continue

2、条件语句:if、else、goto

3、开关语句:switch、case、default

4、返回语句:return

存储类型关键字(5个)

auto、extern、register、static、typedef

其他关键字(3个)

const、sizeof、volatile

三、数据类型

short=short int     long =long int   在这里int被省略了没写而已

注意:C语言本身并没有字符串类型,我们在C语言程序中使用的字符串实际上是字符数组,即多个字符构成的就是字符串!

Q:为什么会有这么多的类型?

A:一方面是能够存储更加多样的数据,便于进行数据处理;另一方面的原因就是为了能够更好节约我们的内存空间。

Q:每种类型的大小是多少?

A:这里我们需要引入大小的概念,还需要了解C语言中的关键字sizeof
计算机内部运行和处理的数据是二进制
1 bit(比特) 存一个二进制位
1 byte(字节)= 8 bit
1 KB = 1024 byte 
1 MB = 1024 KB 
1 GB = 1024 MB

这里需要注意sizeof不是函数,是关键字也是运算符。(关键字≠运算符)

这里我们用到了之前讲到的printf、%d、\n、sizeof、数据类型。

以第五行为例,意思是——在屏幕上以十进制的形式(%d)打印(printf)数据类型char的大小(sizeof),并换行(\n)。

所以我们得到了数据类型char的大小为1个字节(byte)。

其他基本的数据类型大小由上图可知,这里不再赘述。

现在我们知道了这些数据类型的大小,下面我们来列举一下他们的作用。

Eg:让我们先看一下图片中的第5行与第10行,char a = 'b',这里的意思是以字符形式定义a为b。然后以字符形式(%c)打印a,所以在运行框中的行显示了结果为b。

再看一下第8行与第16行,以小数形式定义d为3.14,以.1f形式来打印d,此处的.1f就是我们之前解释到的printf的输出格式。

所以.1f的意思就是输出时,小数点后面保留1位,所以输出的结果不是3.14而是3.1。
所以这里我们可以思考一下,如果我设int a=3.14,并且以%d的形式打印a,结果会是什么呢?

显而易见的,输出的结果为3。
因为int a是定义一个整数变量a,所以我们尽管让a=3.14,但是因为被int所限,结果为3。
如果这里我们把%d换成%f呢?

这样的话,编译器会对我们进行警告。

编译器提示我们传递了非浮点型参数,也可以理解为我们传递的是整数,也就是说编译器在到第六行的时候已经认为a=3了,而在这里调用printf函数需要浮点型参数(小数)。附上运行结果。

在这里我们不再继续深究这个问题,目的是让读者朋友更好的了解数据类型,未来的文章提到时会继续对此解释。

四、常量与变量

在整个程序的运行过程中,没有变化且不能变化的,我们称之为常量
在程序运行期间,可以改变并且有可能会改变的,我们称之为变量

1.如何定义变量

声明变量的公式:数据类型 + 标识符 + 分号

int age666 = 150;

float w_eight = 45.5f;(加f原因:编译器默认为double类型。)

char BBQ = 'w';


  • 在这里我们引入标识符这个概念:

标识符是由我们自己命名的一个标识,用于表示一个变量、函数或其他实体的名称。例如:上面的代码中age666、w_eight、BBQ都是由我们自己命名的一个标识,用于表示一个变量。
标识符必须经过声明或定义才能正常被编译器识别,而关键词可以直接使用。


  • 当我们自定义标识符的时候应遵守以下原则

1.只由英文、数字、或 _(下划线) 组成
2.个字符只能是英文字母或下划线,不能是数字
3.大小写英文字母代表不同的字符
4.不能是C语言的关键字


2.如何使用变量

变量的使用要遵循“先定义后使用的原则”。


显而易见的,张图片的代码是遵循先定义后使用的原则,是正确的,

第二张图片则反之,让我们一起看一下报错信息。


所以我们需要遵循先定义后使用的原则


3.变量的赋值与初始化

我们思考一下,下面的代码,它的打印出来的数值是多少呢?

显而易见的,我们没有对a进行赋值。错误结果如下。

因为变量a没有被装入任何确定的值,它就被使用了。现在它的值是一个随机值,这样的随机值会导致程序产生错误的结果。因此,在Visual Studio 2019中默认设置下,使用这种变量是无法通过编译的。
所以我们需要赋予变量a一个值,这里有两种方法,一是变量声明后立刻初始化;二是变量先声明,之后需要使用时再为变量赋值。


请注意:变量可以多次赋值,但是不能被多次初始化。


4.变量的作用域及生命周期

话不多说,先上代码,大家可以思考一下这段代码的结果是什么。

运行结果如下:

这里先不做解释,我们一起来看一下作用域生命周期的定义:


作用域(scope)是程序设计概念,通常来说,一段程序代码中所用到的名字并不总是有效/可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域。1. 局部变量的作用域是变量所在的局部范围。2. 全局变量的作用域是整个工程。


生命周期:变量的生命周期指的是变量的创建到变量的销毁之间的一个时间段。1. 局部变量的生命周期是:进入作用域生命周期开始,作用域生命周期结束。2. 全局变量的生命周期是:整个程序的生命周期。


简单一点来说:在代码块外的就是全局变量,在代码块内的就是局部变量。(代码块就是“{ }”)。从上面代码运行的结果我们也可以得到一个简单的结论:当全局变量和局部变量重名时,遵循“局部变量优先”原则。

这里还有一些内容不做介绍,在未来的分支与循环结构的内容中还会再次解释。


5.常量
常量比较好理解,下面我们介绍常量的几种形式:
  • 字面常量

  • const 修饰的常变量

  • #define定义的标识符常量

  • 枚举常量


①字面常量:

非常好理解,就是你想象的字面常量,对,没错。

②const修饰的常变量:

const是关键字,说明这个类型的数据为“只读变量”。被const修饰的变量具有某种常属性——只可以被读取,不可以被修改然而他本质上还是个变量,只不过具有常属性。(未来文章解释) 为了读者朋友们易于理解,附上代码。

这里的错误都指向了第六行,编译器提示我们,表达式必须是可修改的左值,相当于const将a锁定为了只读变量,不可以修改。当未来分享数组的内容时,我们还会再次介绍const,这里不再做更多解释。

③#define定义的标识符常量
定义方法 #define <标识符> <常量>
这也是为什么刚刚需要引入标识符这个概念。
我们也先来演示一下#define定义的标识符常量:

这里我们用define定义了LHaisland的值为2022。与const不同的是define定义的就是一个真常量了!这里也需要注意,因为是真常量,所以不可被更改。

思考:使用define定义的好处是什么?

A:我们并没有直接写LHaisland=2022,而是定义了一个标识符常量LHaisland。这样做有什么好处呢?比如,我们这个程序很庞大,LHaisland不仅仅被用在main函数中,还被用在其他很多函数里面。如果有一天,这个数值需要改变了。那么我们就需要到每一个使用过的地方进行修改,这样修改起来会非常麻烦。但是,我们定义了LHaisland的数值,只需要修改这个符号常量所代表的值即可。希望读者朋友们能够理解我想表达的意思,如果不能理解的话,这里换一个商品价值3元的例子,假设商品涨价为4元,那么所有的超市都需要去修改原来的售价,工程量非常大,需要修改的地方非常多,如果我们用define定义过这个商品,那么我们只需要修改一次即可达到我们想要的目的。


④枚举常量(不经常使用,仅了解即可)
枚举从字面意思上看就是一一列举,生活中很多东西都可以一一列举,它们都可以用枚举来表示。

枚举常量使用方法:enum 枚举类型名 { 常量1,常量2,… };

例如定义一个性别的枚举常量:enum Sex {MALE,FEMALE,SECRET};

这就定义了一个新的数据类型:Sex
Sex数据类型来源于int类型(默认)。
Sex类型的数据只能有3种取值,它们是:MALE,FEMALE,SECRET。
其中MALE= 0,FEMALE = 1,SECRET=2也就是说,第1个枚举值代表0,第2个枚举值代表1,这样依次递增1。
不过,也可以在定义时,直接指定某个或某些枚举值的数值。
enum Sex  {MALE=1,FEMALE,SECRET};我们希望MALE从1开始,枚举类型默认枚举值从0开始,所以我们直接指定MALE等于1,这样,FEMALE就将等于2,SECRET等于3。
枚举常量,一经定义后,就不可再改变。下面附上代码,进行结果展示。

这里我们将MALE=1

这里进行错误演示,更改枚举常量,令SECRET=10

导致编译器报错


这里补充说明枚举常量和宏定义的区别与联系(了解即可)
宏和枚举的主要区别是作用的时间和存储形式不同宏定义是在编译预处理阶段作用的,也就是在编译预处理时,就会进行宏替换,将程序中的所有宏名替换为所定义的常量名,而枚举则是在程序运行之后才起作用的宏定义不分配内存空间,而枚举常量存储在数据的静态存储区中。宏只占用代码段的空间,而枚举除了占用代码段空间外,还会耗费CPU资源。

至此我们已经初步了解了数据类型、常量与变量以及printf输出格式、关键字、标识符的大致内容
由于篇幅有限,下一次内容我们将分享字符串、转义字符、注释以及选择语句、循环语句的基础内容。
如果您在阅读中发现内容错误或者有好的想法以及建议,欢迎在公众号内给我留言,我将不胜感激!
感谢您能够阅读到这里,我们下次再会!

责编:霖海岛LHaisland

审核:霖海岛LHaisland

图文来源:霖海岛LHaisland


相关文章