- 数据类型的使用,很大一部分是用来创建变量。
- 生活中有些值是保持不变的(比如:血型、圆周率等等)
- 有些值是可变的(比如:年龄、体重等等)
而这些值,在C语言当中,不变的值用常量的概念来表示,能改变的值,用变量来表示。
(2)定义变量的方法int age = 22; //定义一个整型
float weight = 150.5f; //定义一个单精度的浮点数
char name = 'c'; //定义字符A
(3)变量的分类
1.全局变量
函数外定义的变量称为全局变量。
简单来说: { } 外部定义的都为全局变量
2.局部变量
函数内定义的变量称为局部变量
简单来说:{ } 内部定义的都为局部变量
全局变量与局部变量的注意点
若局部定义与全局定义名字冲突的情况下,局部变量优先
正常情况下:
//全局变量a
int a =100;
int main(){
//局部变量b
int b =10;
}
若全局变量与局部变量名字冲突:
int a=100; //全局变量a
int main(){
int a=10; //局部变量a
printf("%d\n",a);
}
输出的结果为10,因为在全局变量与局部变量名字冲突的情况下,局部优先
(4)变量的使用
计算两个整数的和
#define _CRT_SECURE_NO_WARNINGS 1 //防止使用scanf函数报错
#include
int main()
{
int a = 0;
int b = 0;
int sum = 0;
scanf("%d %d",&a,&b); //scanf为输入函数
sum = a + b;
printf("sum = %d\n",sum);
return 0;
}
使用scanf函数报错解决办法:
在源文件的第一行,加上:
#define _CRT_SECURE_NO_WARNINGS 1
scanf_s函数 是VS编译提供的,不是C语言标准规定的。
(5)变量的作用域和生命周期- 作用域
局部变量的作用域:就是变量所在的局部范围
全局变量的作用域:整个项目
int a =2022; //全局变量a
int main(){
printf("1:%d\n",a); //第一次打印a
{
printf("2:%d\n",a) //第二次打印a
int b=10; //局部变量b
printf("b = %d\n",b); //第一次打印b
}
printf("3:%d\n",a); //第三次打印a
printf("b=%d\n",b); //第二次打印b
return 0;
}
输出结果为:
1:2022
2:2022
b = 10
3:2022
报错
从上可以看出全局变量a不论是在哪都可以打印出来,而局部变量b只能在中括号的范围内打印,在main函数中则打印提示错误。
跨文件的调用
上图定义了int a,如果我想在同一个项目下另一个文件调用,则只需要在另一个文件中声明变量,就可以使用上个文件的变量a
extern int a; //声明变量
int main()
{
printf("%d\n",a);
return 0;
}
控制台输出a的值
- 生命周期
- 变量的生命周期:变量的创建和销毁之间所存在的时间段
- 局部变量的生命周期:进入局部范围生命开始,出局部范围生命结束。
- 全局变量的生命周期:这个程序的生命周期。
int main()
{
{
int a =2022;
printf("%d\n",a);
//a的生命周期等于于这个中括号的范围,如果出了这个中括号,它被销毁,则生命周期结束
}
return 0;
}
(6)常量
C语言中的常量分为以下几种:
- 字面常量
- const 修饰的常变量
- #define 定义的标识符常量
- 枚举常量
- 字面常量
定义的普通常量
int main(){
3.14; //浮点型常量
2022; //整型常量
"chen"; //字符串常量
}
- const 修饰的常变量
const定义的是常变量 但不等于 常量
定义出来的变量都可以被改变
int main(){
int num = 10; //定义变量num=10
num = 20;
printf("num = %d\n",num);
return 0;
}
输出的num为20,因为num在定义后被改变
但若是由const 定义的变量,则不能被改变
int main(){
const int num = 10; //num是常变量 - 具有常属性(不能被改变的属性)
num = 20;
printf("num = %d\n",num);
return 0;
}
控制台报错:
左值被const指定
注意:C语言中,数组在定义的时候,数组的长度通常是由一个常量来定义
int main(){
int arr[10] = {0}; //创建一个数组,有10个元素
int n = 10; //定义一个变量n为10
int arr2[n] = {0}; //n是变量,数组必须填入一个常量值才可以创建
return 0;
}
控制台报错:
表达式必须含有常量值
数组定义应输入常量表达式
不能分配常量大小为0的数组
若以const 修饰的常变量来定义数组也不行
int main(){
int arr[10] = {0}; //创建一个数组,有10个元素
const int n = 10; //用const修饰一个常变量n为10
int arr2[n] = {0}; //n是常变量
return 0;
}
控制台报错:
表达式必须含有常量值
数组定义应输入常量表达式
不能分配常量大小为0的数组
上面两段代码都得到同样的报错信息,所以虽说const修饰的变量虽然是常量值,但不是真正意义上的常量,本质上还是变量。
3.#define 定义的标识符常量
#define MAX 10000
int main(){
//MAX = 20000; //报错,因为前面MAX是#define定义的常量,所以不能改变它的数值
int n = MAX;
printf("n=%d\n",n);
}
控制台输出:
n = 10000
4.枚举常量
可以一一列举的常量
例如:性别、
下面以性别为例
enum Sex
{
//枚举常量
//这种枚举类型的变量的未来可能取值
MALE, // MALE = 3 ,若赋给MALE初值为3
FEMALE,
SECRET
};
int main(){
enum Sex s =MALE;
printf("%d\n",MALE);
printf("%d\n",FENALE);
printf("%d\n",SECRET);
return 0;
}
控制台输出:
0 //3
1 //4
2 //5
//从输出可以看出枚举常量的值是从0开始,默认第一个值为0
//若给MALE赋初值为3,则后面的值依次后移
枚举常量的值是从0开始,默认第一个值为0
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)