变量、常量
常量:
生活中很多数据不可变:血型、性别、圆周率
变量:
很多数据可变:工资、年龄、体重
C语言怎么描述:
常量-不可变的量
变量-可变的量
变量的分类
局部变量
{}内部定义的
全局变量
{}外部定义的
当局部变量和全局变量名字冲突时,局部优先
不建议把全局变量和局部变量的名字取成一样
报错了
scanf这个函数不安全,考虑使用scanf_s instead替换,如果不想看到这样的警告请使用_CRT_SECURE_NO_WARNINGS
将它放入代码的第一行,必须是第一行
然后再次运行就不会报错了
scanf_s函数 - VS编译器提供的,不是C语言标准规定的
如果要使用只能在VS编译器跑起来,别的平台会报BUG
变量的作用域和声明周期
作用域
作用域(scope),程序设计概念,通常来讲,一段程序代码中所用到的名字并不总是有效/有用
而限定这个名字的可用性的代码范围就是这个名字的作用域
通俗的讲,这个变量在哪可以使用,哪里就是它的作用域
1.局部变量的作用域是变量所在的局部范围
2.全局变量的作用域是整个工程
这里报错是因为,{}内的局部变量作用就是{}内,在作用域外不可用
移到作用域内成功运行
可以看到全局变量放在哪都可以运行,不管{}内还是{}外
执行性的语法,如printf需要放在{}内
新建一个源文件add.c,定义一个变量g_vals,再在原来的test_4_20打印这个变量,发现是报错的
因为没有声明变量
声明变量后成功打印
所以说,全局变量的作用域是整个工程(跨文件需要声明)
生命周期
变量的生命周期指的是变量的创建到变量的销毁之间的一个时间段
1.局部变量的生命周期:进入作用域生命周期开始,出作用域生命周期结束
2.全局变量的生命周期:整个程序的生命周期
常量
C语言中的常量和变量的定义的形式有所差异
C语言中的常量分为以下几种:
- 字面常量
- const修饰的常变量
- #define定义的标识符常量
- 枚举常量
const 关键字
您可以使用 const 前缀声明指定类型的常量,如下所示:
const type variable = value;
const 声明常量要在一个语句内完成
加上const 报错了
左值被const修饰,所以这个值无法修改,此时num就是常变量,具有常属性的变量
如何证明num是变量?
此时n是变量,但是定义数组n必须为常量,所以报错了
尝试添加const属性
依旧报错了,所以证明n在这里即使被const修饰后它依旧是变量
常变量依旧本质属性依旧是变量,只是具有不可被改变的常属性,在必须为常量的地方时依旧不可用
#define定义的标识符常量
定义一个标识符常量为MAX,赋值10000
#define在{}内定义也可以
标识符常量不能在代码内修改
枚举常量
枚举常量的定义
enum 枚举类型名{常量1,常量2,常量3,…};
例如定义一个星期的枚举常量:enum Week {Mon,Tue,Wed,…};
这就定义了一个新的数据类型:Week。
Week数据类型来源于int类型(默认)。
Week类型的数据只能有7种取值,它们是:SUNDAY,MONDAY,TUESDAY……SATURDAY。
其中SUNDAY = 0,MONDAY = 1……SATURDAY = 6。也就是说,第1个枚举值代表0,第2个枚举值代表1,这样依次递增1。
不过,也可以在定义时,直接指定某个或某些枚举值的数值。比如,对于中国人,可能对于用0表示星期日不是很好接受,不如用7来表示星期天。这样我们需要的个值就是 1,2,3,4,5,6,7。可以这样定义:
enum Week {MONDAY = 1,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY,SUNDAY};
我们希望星期一仍然从1开始,枚举类型默认枚举值从0开始,所以我们直接指定MONDAY等于1,这样,TUESDAY就将等于2,直接到SUNDAY等于7。
枚举值,我们就称为枚举常量,因为它一经定义以后,就不可再改变,以下用法是错误的!
TUESDAY = 10; //错误!我们不能改变一个枚举值的数值。
用枚举常量来完成表达今天是星期三:
Week today = TUESDAY;
枚举常量不能修改,只能修改附初值
修改附初值后
枚举常量会从初值累加