你好哇,我是单字鹏。欢迎进入我的C语言总结。
前面我们学习总结了数据类型中有关内置类型的介绍,有了数据类型要如何使用了?
进入本篇博客的主题变量。
变量?
什么是变量?是可以改变的量吗?如果能改变那么是否有不可改变的量?
要理解这些问题,我们就得浅浅的谈一下什么是代码,什么是编程。
代码就是任务表,告诉计算机你要完成哪些任务。就好比我们在玩游戏时要向NPC接任务得奖励,比如叫我们去解救被关押的人质得到奖励,但是就是有老六总是找空子跳过任务直接得奖励这就是代码BUG。
编程就是编写逻辑,告诉计算机你要如何去完成任务,毕竟计算机不是人它不能向人一样会思考。所以当你的代码出现BUG的时候可不要把责任怪罪到计算机的头上哦,毕竟是你告诉它这么做的。
有了任务表就要去表述这些任务,变量就诞生了。
在代码的世界中 变量 就是给内存中的某一块空间起名字。
就好比现实生活中你的名字,是由几个汉字的有机组合,名字本事没有意义,但是当我们叫这个名字时那就有了意义。
那在C语言的代码中哪些是需要起名字的了?
变量,函数,数组...甚至于数据类型的关键字都是名字,帮助我们去描述,记录某一空间,事务
给这些变量,数组起名字是否有规制了?
有的。名字只能是字母,数字 和 _ (下划线) 三者组成,没有规定使用字符的数量,但是首字符不能是数字。
在代码中ch 、sh、in、fl..这些就是变量名,数据类型char/int/double 就是它们各自的属性,=后面的数值 字母。就是它们存在的意义,保存这些值。
变量的具体介绍
在C语言中有全局变量和局部变量
在此之前我们要理解函数体{} 代码块{} 和文件的认识
int main()
{
return 0;
}
//main 就是一个函数 是C语言的入口函数,我们在编写的代码都是从这个入口开始执行的
//main 它的下面{ }和里面的代码就是函数体
代码块{} 它既可以理解成函数体 也可以是函数体中的某一块完整的代码块
#include <stdio.h>
int main()
{//函数体的开始
int a=10;
{//代码块的开始
char ch='a';
}//代码块的结束
return 0;
}//函数体的结束
代码块于代码块之间有平行关系 也有包含关系
#include <stdio.h>
int main()
{//函数体
int a=30;
{//代码块1
int b=20;
}
{//代码块2
int c=10;
{//代码块3
int d=0;
}
}
return 0;
}
函数体 里面包含代码块1,代码块2和代码块3。 代码块1和代码块2属于平行 。代码块2包含代码块3.
文件的认识
我们在编写代码是要现创建一个工程文件,在工程中在创建一个test.c的文件
在C语言的工程中的各个文件都是独立的都是有自己的秘密,不能被其他文件发现的。
所以在各自文件中的变量,函数等都是只属于各自的文件的。那我要把一个文件的秘密暴露给其他文件了,就是extern关键字的工作了。
局部变量
就是在函数体里面定义的变量,或者是在代码块中定义的变量。
如果把代码块比作国家,局部变量就是代码块里面的人民。你出了自己的国家你就不能享受自己国家的各种基建便利、活动
#include <stdio.h>
int main()
{//函数体
int a=30;
{//代码块1
int b=20;
}
{//代码块2
int c=10;
{//代码块3
int d=0;
}
}
return 0;
}
变量a 在整个函数体内都是起作用的,而变量b只在代码块2中起作用,出了代码块2就没有意义和作用。同理变量c就只能在代码块2和3中起作用。
总结局部变量 在函数体内定义的变量。出了函数体或代码块就失去了意义,没有了价值。
全局变量
在函数体外 创建的变量就都是全局变量。在整个C语言程序中从创建这个变量开始到C语言程序结束都是起作用的。它不光在一个文件中起作用还可以在其他文件中起作用。因为他有外部连接的属性。
需要注意的是当局部变量和全局变量同名的时候,局部变量有先。局部变量 在代码块中有冲突时子集的代码块优先。
变量的具体使用
前面讲到变量就是一个名字,代表的是内存中的一块空间。而数据类型就是这块空间的属性。
用来保存数据。
创建变量和使用变量
创建变量是有规定的格式的 :
数据类型+空格+变量名+ ;(英文的分号)。 这叫定义变量 如果是局部变量在内存中是一个未知的数字随机值(是一种非常危险的做法) 全局变量是 0
数据类型+空格+变量名+ = + 类型对应的数据 +;(英文的分号)。 这叫初始化 创建变量并给它赋值
变量名 + = +类型对应的数据。这叫变量的赋值
变量名是内存空间的名字,数据类型是内存空间的属性 定义一个变量它对应的内存空间是多大了?
从代码就可以看出内置类型的空间大小就是变量在内存中的实际空间大小。
区别在于变量是有实际的内存空间,而数据类型只是一个设计图 记录了变量需要的信息、属性。
变量的数值溢出
数据类型的取值范围是有限定的就以整形的char为例
浮点型的溢出在 数据是如何保存在内存中进行讲解
变量的作用域和生命周期
什么是作用域,就是变量从定义时开始到它销毁的这段范围就是作用域
局部变量的作用域:就是在函数体/代码块中从定义变量开始 到函数体/代码块结束的一段范围
全局变量的作用域:就整个工程 就是从C语言程序开始到结束
static 和extern 修饰变量
static修饰局部变量 改变的是局部变量的生命周期,局部变量的生命周期是出了它所在的代码块之后就会失去作用销毁。static修饰过的局部变量在出了代码块还是有效但不会销毁。但是它的作用域是没有改变的
普通的局部变量的在函数中每次调用都只+1,static修饰的变量在函数中每次打印在原有的基础上+1
static修饰全局变量。全局的变量的作用域和生命周期都是整个工程。但是我不想让其他人或者其他文件知道它 调用它。就可以使用static修饰全局变量改变它的作用域,只在本文件中起作用。让它只属于一个文件的秘密
extern 的作用是告诉文件在其他文件中有一个全局变量,你可以使用它。
所以extern修饰变量时 只能修饰全局变量,因为全局变量的作用域和生命周期是整个工程。全局变量有外部连接的属性,static就是改变它的外部链接属性,使其他文件不能来连接它。
常量
在C语言中常量就是不可改变的量
#include <stdio.h>
//举例
enum Sex
{
MALE,
FEMALE,
SECRET
};
//括号中的MALE,FEMALE,SECRET是枚举常量
int main()
{
//字面常量演示
3.14;//字面常量
1000;//字面常量
//const 修饰的常变量
const float pai = 3.14f; //这里的pai是const修饰的常变量
pai = 5.14;//是不能直接修改的!
//#define的标识符常量 演示
#define MAX 100
printf("max = %d\n", MAX);
//枚举常量演示
printf("%d\n", MALE);
printf("%d\n", FEMALE);
printf("%d\n", SECRET);
//注:枚举常量的默认是从0开始,依次向下递增1的
return 0;
}