常量-不能改变的量
变量-能改变的量
如果拿人来举例的话
常量即为人出生时就具有的数据,且不可改变
例如:生日,血型,性别等。
变量则为人出生后具有的量,且可以改变
例如:喜欢的人,年龄,工作等。
1变量
#include<stdio.h>
int main()
{
int age = 20;
return 0;
}
int为变量的类型,age为变量的名字(自己定义,没有特殊含义),20是赋值。
若没有初始值则赋0,不赋值也可以,但是不推荐。
int main()
{
int age = 20;
age = age+1;
printf("%d\n", age);
return 0;
}
试着改变age的值,运行。
变量age改变。
1.1变量分类
变量分为两种,局部变量和全局变量
简单的区分
局部变量就是在大括号{}内部的变量
全局变量则是在大括号{}外部的变量
int a = 100;
int main()
{
int a = 10;
return 0;
}
当两个变量命名冲突时,局部变量优先。
1.1.1变量的作用域和生命周期
作用域(scope):声名的变量并不是一直可用的,而显示这个变量可用的范围,就称作这个变量的作用域。
简单来说就是这个变量在哪里起作用,哪里就是这个变量的作用域。
int main()
{
int a = 10;
printf("%d", a);
return 0;
}
printf("%d", a);就是变量a的作用域。
局部变量的作用域:就是变量所在的局部范围。
如果出了变量的局部范围,例如:
int main()
{
{
int a = 10;
}
printf("%d", a);
return 0;
}
出现的结果
因为出了局部变量a的作用域(a所在的大括号),所以运行失败。
全局变量的作用域:整个工程。
创建一个全局变量b。
int b = 2023;
int main()
{
printf("%d\n", b);
{
printf("%d\n", b);
}
return 0;
}
运行
可以看出都成功打印了。
不仅在同一个头文件中可以全局使用,即使在同一个项目中的不同头文件中也可以使用,但需要先用 extern 声明(简单来说就是告诉编译器去找这个变量)。
在另一个头文件中使用
extern int b;
int main()
{
printf("%d\n", b);
{
printf("%d\n", b);
}
return 0;
}
运行结果如下
变量的生命周期:变量被创建到销毁这个时间段。
局部变量的生命周期:进入局部范围生命开始,离开局部范围生命结束。
全局变量的生命周期:程序开始生命开始,到程序结束生命结束。
2常量
2.1常量的分类
常量分为四种:字面常量、const修饰的常变量、#define定义的常变量、枚举常量
字面常量:
const修饰的常变量(const的量就是常变量,具有常属性(不能被改变的属性)):通常来说声明一个变量,是可以更改他的数值的,例如:
int main()
{
int num = 20;
num = 30;
printf("%d\n",num);
return 0;
}
运行结果为30,证明num数值被改变。使用const
int main()
{
const int num = 20;
num = 30;
printf("%d\n",num);
return 0;
}
程序就会报错。
错误原因:
但是,常变量本身还是属于变量!打个比方
int main()
{
const int a = 20;
int arr1[10] = {0};//arr[]是数组,数组里面的必须是常量
int arr2[a] = 10;
printf("%d\n",arr2[a]);
return 0;
}
这说明a理论上还是一个变量,只不过多一个常属性,可以理解为给苹果镀了一层金,但不能被叫成金属,因为本质上他还是苹果。
#define定义的常量:定义一个标识符来表示一个常量,被称为符号常量。
不能重新赋值,会报错。
枚举常量:可以一一列举的常量。
enum Sex
{
MALE,
FEMALE,
SECRET
};
enum是枚举常量的固定搭配,声明一个变量’性别‘,有三种情况男女保密(也许还有其他性别,但在本文中只取其中三种),一一列举出来。
程序报错,证明define定义的是常量,不可修改。但是可以赋初始值。例如:
enum Sex
{
MALE=3,
FEMALE,
SECRET
};
int main()
{
enum Sex s = MALE;
printf("%d\n", MALE);
printf("#d\n", FEMALE);
printf("%d\n", SECRET);
return 0;
}
运行结果