变量与常量:
什么是变量?什么又是常量?
变量的定义:
变量是由:变量类型 + 变量名 + 初始化
蓝色标注的就是前面介绍的类型,黑色的则是变量名它是由我们自己取得 ( 但最好取一个有意义的名字方便自己和别人知道它的用处 ),赋值(=号在C语言里是赋值的意思)加对应的数据就是初始化。 有一点值得注意,我们在看一些C语言教材时里面的内容往往不会将变量的初始化,但这是一个不好的习惯。
那为啥呢?
如果不将其初始化那么变量里会进入随机值,有些编译器甚至会闹脾气报警告。
我们看到警告的原因是,“局部变量age使用了,但是没有给它初始化”,也就是说未初始化就使用它了。
这里提到了局部变量的概念,那什么是局部变量呢?有局部那有没有全局变量呢?
变量的分类:
局部变量 :
全局变量 :
什么是局部变量变量和全局变量? 为啥有全局变量和局部变量之分?
所谓的局部变量就是定义在代码块类的变量,而全局变量就是定义在代码块外的变量
???什么又是代码块?
代码块就是{... ...}就是这样的括号,而在着里面定义的变量就局部变量,定义外面的就是全局变量。上代码
这里的a和b就是就是局部变量。那b不是定义在代码块外的吗?注意这里b虽然不在a所在的代码块内,但它本身仍在代码块内。只有像g这样不在任何代码块内的才叫全局变量。 有写教材上写,局部变量是定义在函数内部的变量这其实不严谨的。
那如果全局变量和局部变量的名字冲突了会怎么样,会报错吗?
我们看到并没有,而是在屏幕上输出了一个50。 没错当全局变量和局部变量命名起冲突时局部变量优先使用。
那为什么要有全局变量和局部变量之分呢 那就不得不提到作用域和生命周期的概念
变量的作用域和生命周期:
作用域:
![](https://i-blog.csdnimg.cn/blog_migrate/0eecc500d81b5b9c9e2776c11a2cf8c9.png)
这个报错的意思是:找不到g这个变量。
局部变量g只能它所在的代码块内使用,出了这个作用域就不能使用了。
而全局变量则可以在这个工程内使用它,但然也可以在这个工程中的其他文件中使用
xtern 是个C语言的关键字,它的作用是声明外部符号。就是告诉编译器这有个变量,是什么类型、名字是什么.....
生命周期:
回到之前的问题为啥有全局变量和变局部量之分?直接全部全局变量不好吗?
还记得之前说的变量的创建需要根据类型去申请对应的字节数吗? 全局变量的生命周期时整个程序的生命周期,也就是说直到程序结束全局变量才会把之前申请的内存单元还给内存如果申请,因此过多的全局变量会占用较多的内存单元。
当然全局变量和局部变量的特点不止这一点,全局变量和局部变量是为了代码的灵活性,便于使用。
常量:
C语言中的常量和变量的定义的形式有所差异。
C语言中的常量分为以下以下几种:
字面常量
const 修饰的常变量
#define 定义的标识符常量
枚举常量
字面常量:
字面常量不多介绍如图:
const 修饰的常变量:
const是C语言的关键字它的作用是修饰变量,使得变量拥有常属性。
这里编译器报了一个错:左边必须是可以修改的值。所谓常属性就是不能被修改,但可以进行初始化。
注:上面例子上的 n 被称为 const 修饰的常变量, const 修饰的常变量在C语言中只是在语法层面限制了 变量 n 不能直接被改变,但是 n 本质上还是一个变量的,所以叫常变量。
#define 定义的标识符常量:
#define是C语言的预处理指令,预处理也就是在编译之前进行的处理,在编译之前会进行替换。
什么意思呢?
在这里MAX等价于100,预处理也就是说在进行编译之前会把MAX给替换成100。
大概就是这样(我这里是自己改的,便于理解),当然MAX也有常属性。
枚举常量:
枚举的意思就是枚举出可能的取值,然后给定该值就无法修改。
enum是枚举关键词 Sex是你要枚举什么(我这里要枚举的是三原色)用一对{}框起来外面有一个分号,里面就是枚举的可能取值用逗号隔开。(那些枚举的可能取值就是枚举常量) 在这里我们一一打印出枚举常量的取值发现它们有一个初始的值。
注:枚举常量的默认是从0开始,依次向下递增1的
如果对其修改编译器就会报错,说:SECRET是常量。
注:枚举常量可以初始化(初始化,就是在创建时赋值)
在路上!!