C语言学习之路
第一章 初始C语言
第二章 变量
文章目录
前言
在初始C语言的文章中,我们编写了第一个程序。但是我们知道,编程的其中一个目的就是对数据的处理。在生活中,一个人的身高、体重、年龄和性别等,都是不同类型的数据。在这些数据中,有一些是变量,例如年龄、身高等,还有一些是常量,例如性别。
而这些数据,在C语言中,又是如何体现的呢?本章将会进行详细的讲解。
一、变量
1、代码展示:
//作者本人的数据特征表示如下:
short Age = 18;
int Born_Year=2004;
long Born_Day=20040206;
long long Call_number=12345678910;
float Weight=56.5;
double Height=175.00;
char Name='Y';
2、代码详解:
(1)数据类型:
在前言中,我们发现,一个人的各项指标都是描述这个人特征的数据。但是这些数据除了在数值上不同外,在数据的类型上也不尽相同。例如:一个人的姓名属于字符型,一个人的身高可以精确到小数部分,一个人的年龄为整数等等。
那么,在C语言中又有哪些分类呢?
- 整型:
整型就是我们常说的整数,即不含小数部分。
短整型:short
整型:int
长整型:long
长长整型:long long
- 浮点型:
浮点型就是我们常说的小数
单精度浮点型:float
双精度浮点型:double
- 字符型:
字符型就是我们在学习英语时的英文字母。
字符型:char
以上就是在C语言中常用的数据类型,其后面的英文单词即告诉编译器你要创建一个什么类型的变量,这些单词又称为关键字。至于如何创建变量我们稍后会加以详细的讲解。那么我想,读者在看到这些分类时,除了不知如何使用外,另一大困惑在于,同一种数据类型为何又多种形式,这些形式又有什么不同?这样分类的意义又是什么呢?在解决这个问题之前,我们先不妨了解一下数据所占的内存情况。
(2)内存的占用:
在讲解不同的数据类型所占内存之前,我们首先应该对计算机的内存单位有个大致的了解。
a、常用单位:
名称 | 单位 |
---|---|
比特 | bit |
字节 | byte(B) |
千字节 | KB |
兆字节 | MB |
吉字节 | GB |
太字节 | TB |
在《初识C语言》一章中,我们了解到,机器语言是由0和1组成的。此处提到的1比特就是存储0和1中的一个数字所需的内存空间。有了这样的认识,我们就可以了解一下单位间的换算关系。
1 B = 8 bit
1 KB =1024 B
1 MB =1024 KB
1 GB = 1024 MB
1 TB = 1024 GB
b、内存与数据范围的关系:
那么内存的大小又有什么作用呢?
为了回答这一问题,我们便需要理解一下,二进制与十进制语言。
我们最常用的就是十进制,即小学加法中,满10进1。同理,二进制语言就是满2进1 。
上图为3个比特(bit)内存大小所能存储的数据范围。图中最多加7次,最多存储8个不同的数字,即23个。
同理,由上图可知,存储的范围是4个数字。即22个
综上所述:存储数字的范围由内存的大小决定,内存所占越大,存储数字的范围越大。同时,我们能够归纳出一个数学公式:
存储的数字的范围记作N。所占内存为X比特(bit)。
那么:N=2X(个)
c、数据类型所占内存:
数据类型 | 内存(字节) | 范围 |
---|---|---|
short | 2 字节 | -215~215-1 |
int | 4字节 | -231~231-1 |
long | 4或8字节 | -231~231-1 或-263~263-1 |
long long | 8字节 | -263~263-1 |
float | 4字节 | 有效数字8位 |
double | 8字节 | 有效数字16位 |
char | 1字节 |
基于刚才对于内存单位的了解和数据范围的计算,我们可以轻松印证不同整形数据的范围中的数字个数。
基于以上的认知,我们就能够解释为什么要设置不同大小的整形数据,由于其内存不同,造成了其能够存储的数据范围不同。那么这样的好处在于,当我们存储一个较小的数字时,可以使用短整型,当我们输出一个较大的数字时,可以使用一个长整型。这样就能够避免内存空间的浪费。
(3)语法规范:
数据类型 + 变量名称 = 初始值 ;//推荐
数据类型 + 变量名称 ;// 不推荐
//给字符型变量赋值时,需要给值加上,英文输入法下的单引号:''。
我们可以通过生活中的例子来理解这个语法。在买房的过程中,我们会先选择一个合适的户型,然后为了精确地找到自己的家,我们会在门口挂上门牌号,接着我们会在房间内放置一些家具。
由此类比,在创建一个变量时,我们先根据变量的类型,写明数据类型,然后我们在根据需要给变量起名。接着,在赋予初始值。
一般情况下,我们最好赋予一个初始值,避免出现bug。同时,在起名字的时候,我们需要注意的是,该名称能够表明该变量的含义,例如年龄,身高,从而增强代码的可读性。
二、 变量的输出:
当我们成功构建一个变量后,我们又如何将这个变量打印出来呢?
1、代码展示:
#include<stdio.h>
int main()
{
//创建一个变量
int a=0;
float b=0;
double c=0;
char d='a';
//打印变量:
printf("a= %d \n",a);
printf("b=%f \n",b);
printf("c=%lf \n",c);
printf("d=%c\n",d);
return 0;
}
2、代码解读:
首先,我们想要打印某个变量,就需要用到,我们之前学到的库函数中的printf()函数。
那么在括号内部我们会发现一个统一的结构,%字母
。这个部分相当于一个占位符,即告诉编译器,我们要在这个位置打印某个类型的数据。这时候,需要注意的是,不同的数据类型,%后面的字母是不相同的:
%d ——整型
%f——单精度浮点型
%lf——双精度浮点型
%c——字符型
然后,我们会发现后面有一个\n
这一部分的意思是换行。
接着,我们会发现,在双引号的后面,接了一个英文输入法下的逗号,再写了一个我们想要输出的变量值,这个值最终打印的位置,就是刚刚提到的%字母
的位置。
三、变量的输入
刚才我们展示了如何向外展示一个变量,那么接下来我们将要学习的是,如何向内输入一个变量值。
1、代码展示:
int main()
{
int a = 0;
int b= 0;
scanf("%d %d",&a,&b);
return 0;
}
2、代码解读:
类比变量的输出,在代码的输入中,我们同样需要调用库函数中的函数,此时我们调用的是,scanf()
函数。同样,在双引号内,根据我们需要输入的数据类型,依次写下%字母
。起到一个占位的作用,然后,我们在依次输入对应的变量名(一定要按顺序)。
但是这里需要注意的是,我们必须在变量名前加上一个取址符号&
。倘若没有学过C++那么这里直接记住即可。
在C++中,这种传入变量的方式称为引用传递,即传进变量的地址,这样在赋值的过程中,变量的值才会发生变化,即采用了深拷贝的方式。
四、变量的分类
1、全局变量:
大括号外部定义的是全局变量。
全局变量的适用范围非常广,在同一个文件内,可以随时调用全局变量。
倘若不在一个文件内,但是在同一个工程内,则需要利用关键字extern 数据类型 数据名称
声明一下全局变量的存在,才能调用。
int a = 0;
//在自定义的函数内调用
void test01()
{
a=20;//正确
}
//在主函数内调用
int main()
{
a=10;//正确
return 0;
}
2、局部变量:
大括号内部定义的是局部变量。
局部变量的适用范围是由一定的局限性的,局部变量只能在其所在的中括号内调用。倘若在中括号的外部调用,则会出现编译器无法识别的问题。
int main()
{
{
int a=0;
a=10;//正确
}
a=20//错误,因为在大括号外面调用,编译器并不认识
return 0;
}
3、局部变量优先原则:
当局部变量和全局变量同名时,局部变量优先被调用。
但是我们并不建议让二者的变量名称相同,容易出现bug。
int a=100;
int main()
{
{
int a= 10;
printf("%d",a);//最终的输出结果是10,因为局部变量优先调用
}
return 0;
}
五、变量的作用域和生命周期
1、变量的作用域:
局部变量的作用域是该局部变量所在的大括号内。
全局变量的作用域是整个工程,同一文件内直接调用即可,同一工程,不同文件内,需要利用关键字extern 数据类型 数据名称
声明后,再调用。(此处类似于后面学习的函数声明)
2、变量的生命周期:
一个生物的生命周期就是从生物的出生到死亡。而变量的生命周期则是从变量的创建到变量的销毁。
当执行到局部变量的创建代码时,局部变量的生命周期开始,当该局部变量所在的大括号内的所有代码都执行完毕,那么该局部变量会被销毁,即局部变量的生命周期结束。
当执行到全局变量的创建代码时,全局变量的声明周期开始,当整个程序结束时,全局变量才会被销毁,此时全局变量的生命周期结束。
六、总结
本章内容我们学习了变量的创建、输出和输入。以及全局变量和局部变量的知识点。一开始学习时,会不容易理解这部分内容,但是,随着学习的深入,便会逐渐理解。
皈依不在天堂,皈依就在路上。
——史铁生