目录
一、变量
1.1 定义变量的方法
1.2 变量的分类
1.3 使用变量
1.4 变量的作用域
1.5 变量的生命周期
二、常量
2.1 字面常量
2.2 const修饰的常变量
2.3 define定义的标识符常量
2.4 枚举常量
三、练习
一、变量
生活中的有些值是不变的(比如:圆周率,性别,身份证号码,血型等等)。
有些值是可变的(比如:年龄,体重,薪资)。
不变的值,C语言中用常量的概念来表示,变得值C语言中用变量来表示。
1.1 定义变量的方法
int age = 150;
float weight = 45.5f;
char ch = 'w';
创建变量的基本方法:
#include <stdio.h>
int main() {char name = 'A';short age = 25;int high = 180;float weight = 88.5;age = 26;printf("%d\n",age);return 0;
}
1.2 变量的分类
变量:用来描述可变的量。
- 局部变量
- 全局变量
常量:用来描述不变的量。
(1)全局变量和局部变量
#include <stdio.h>
int global = 2019;//全局变量
int main()
{int local = 2018;//局部变量//下面定义的global会不会有问题?int global = 2020;//局部变量printf("global = %d\n", global);return 0;
}
int b = 20;//全局变量:范围更广
int main() {int a = 10;//局部变量:范围小return 0;
}
定义:
#define _CRT_SECURE_NO_WARNINGS 2
int num2 = 20;//全局变量:定义在{代码块}之外的变量
int main()
{int num = 10;//局部变量:定义在{代码块内部的变量}return 0;
}
(2)同一范围内,变量只能定义一次。重复定义,编译器会报错。
同时出现相同变量 :
#define _CRT_SECURE_NO_WARNINGS 2
#include <stdio.h>
int a = 100;
int main()
{int a = 10;//局部变量的名字建议不要相同,容易误会,产生bug//当局部变量与全局变量相同的时侯,局部变量优先printf("%d\n",a);//10return 0;
}
(3)全局变量和局部变量名字相同(冲突),但是局部优先使用。
#include <stdio.h>
int a = 20;
int main() {int a = 10;printf("a=%d",a);//a=10//a= 是加的修饰return 0;
}
全局变量的使用 :
#define _CRT_SECURE_NO_WARNINGS 2
#include <stdio.h>
int a = 100;//全局变量在哪里都可以使用
int main()
{printf("%d\n",a);//100return 0;
}
(4)如果局部没有,就会向外去找变量。
#include <stdio.h>
int a = 20;
int main() {printf("a=%d",a);//a=20return 0;
}
建议:不要将局部变量和全局变量的名字写成一样的。
局部变量的含义 :
- 放在main函数里面的是局部变量,但是不一定所有的局部变量都会放在main函数里面,放在其他地方也可能是局部变量。
- 放到{里面的变量都是局部变量},放到{}以外的变量是全局变量。
总结:
- 上面的局部变量global变量的定义其实没有什么问题的!
- 当局部变量和全局变量同名的时候,局部变量优先使用。
1.3 使用变量
计算两个数的和。
变量的使用(计算两个数相加)。
(1)使用前,建议变量初始化。
代码一:
#include <stdio.h>
int main()
{int num1 = 0;int num2 = 0;int sum = 0;printf("输入两个操作数:>");scanf("%d %d", &num1, &num2);sum = num1 + num2;printf("sum = %d\n", sum);return 0;
}
//这里介绍一下输入,输出语句
//scanf
//printf
scanf:输入函数
printf:输出函数
代码二:固定数字的相加。
#include <stdio.h>
int main()int a = 10;//向内存申请4个字节的空间int b = 25;int sum = 0;printf("%d\n",sum=a+b);//35return 0;
}
代码三:不固定数字相加。
#define _CRT_SECURE_NO_WARNINGS 2
#include <stdio.h>
int main()
{//计算两个数的和int num1 = 0;int num2 = 0;int sum = 0;//输入数据使用scanf输入函数//文件操作前不能保存下来,每次都要打开,打开才开始执行程序scanf("%d%d",&num1,&num2);//&取地址符号,把输入的数字保存到地址符所指向的地址中//int sum = num1 + num2;sum = num1 + num2;//这样写也行printf("sum = %d\n",sum);return 0;
}
在C++里面哪里需要int sum = 0;的值就可以在哪里编写。
C语言语法规定,变量要定义在当前代码块的最前面。
报错原因分析:
解决方法一:仅仅是VS的解决办法,其他编译工具也不能这样做。
解决方法二:不推荐
解决方法三:一劳永逸的办法
一定要拖回去,不然会有Bug,即创建源文件时,找不到C++文件。如下图所示:
1.4 变量的作用域
作用域:作用域(scope)是程序设计概念,通常来说,一段程序代码中所用到的名字并不总是有效/可用 的 而限定这个名字的可用性的代码范围就是这个名字的作用域。
- 局部变量的作用域是变量所在的局部范围。
- 全局变量的作用域是整个工程。
变量的作用域:名字哪里可以使用,哪里就是它的作用域。
局部变量的作用域:
int main() {int a = 10;{int b = 20;printf("a=%d\n",a);//a=10int c = 30;printf("c=%d\n", b);//b=20}printf("b=%d", b); //报错,b是未声明的标识符return 0;
}
全局变量的作用域分为三种情况:
情况一:
int a = 10;
int main() {{printf("a=%d\n",a);}printf("a=%d", a); return 0;
}
情况二:函数内部打印
int a = 10;//全局变量在一个工程中到处都可以使用//写一个简单的函数
void test() {printf("a=%d\n", a);//a=10
}
int main() {test();//调用函数return 0;
}
情况三:其他文件中使用
作用域:变量哪里可以使用,哪里就是这个变量的作用域。
作用域作用于主函数内部:
局部变量的作用域:
#include <stdio.h>
int main()
{int num = 0;printf("num = %d\n",num);//该num的范围(作用域)就是主函数内部 //输出num = 0return 0;
}
#include <stdio.h>
int main()
{{int num = 0;//作用域仅限制于该函数体的{}}//printf("num = %d",num); 不能使用的return 0;
}
#include <stdio.h>
int main()
{{//局部变量的作用域:就是作用域局部变量的{}内部int num = 0;//作用域仅限制于该函数体的{}printf("num = %d", num); //能使用的 //输出num = 0}return 0;
}
#include <stdio.h>
int main()
{int num = 0;//作用域所在的代码块,局部变量的作用域是变量所在的范围{printf("num = %d", num); //num = 0}return 0;
}
全局变量的作用域:
#include <stdio.h>
int global = 2023;
int main()
{printf("glabal = %d\n",global);//glabal = 2023return 0;
}
全局变量的作用域范围真大,在哪里都可以使用:
#include <stdio.h>
int global = 2023;//全局变量的作用域是整个工程,任何地方都可以使用
void test()//定义一个test函数
{printf("test() = %d\n", global);//test() = 2023
}
int main()//main函数从开始到结束就是整个程序的生命周期
{test();//调用函数printf("global = %d\n",global);//global = 2023return 0;
}
引用外部文件也可以当成全局变量来使用:
include是用来声明头文件的,一个文件内容是很多的。
extern仅仅是用来声明外部符号。
1.5 变量的生命周期
变量的生命周期指的是变量的创建到变量的销毁之间的一个时间段:
- 局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束。
- 全局变量的生命周期是:整个程序的生命周期。
一个人的生命周期:出生到死亡。
局部变量的生命周期。
人的生命周期:从出生到死亡。
变量的生命周期:变量什么时候存在,什么时候不存在;什么时候生命开始,什么时候生命结束。
全局变量的生命周期:程序运行,就一直在。
局部变量的生命周期:
#include <stdio.h>
int main()
{{//变量a进入{生命周期开始int a = 10; //{里面都活着呢}printf("a = %d\n",a);//ok可以使用//出去{}也没在了,也不能使用。生命周期结束}//printf("a = %d\n", a);//error不可以使用return 0;
}
全局变量的生命周期:
- 全局变量的生命周期和main函数的生命周期是一样的。
- main函数的生命周期又是程序的生命周期。
二、常量
C语言中的常量和变量的定义的形式有所差异。
C语言中的常量分为以下以下几种:
- 字面常量
- const 修饰的常变量
- #define 定义的标识符常量
- 枚举常量
生活中不变的量就是常量。姓名、性别、血型等。变化的量叫做变量,不变化的量叫做常量。
数值常量(可以进行+-*/):整型常量、实型常量。
字符常量:字符常量(‘a’)、字符串常量("abcd")。
2.1 字面常量
字面常量:字面上就能知道,直观用肉眼就能知道,不能被改动。
int main() {30;3.14;//一个浮点数常量'w';//一个字符常量"abc";//一个字符串常量return 0;
}
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{int num = 4;//3 = 5;不能把常量赋值给另外一个常量3;//字面常量232323;3.14;return 0;
}
2.2 const修饰的常变量
(1)具有常量的属性,常属性,不能被改变。
(2)在C语言中,const修饰的a,本质是变量,但是不能直接修改,有常量的属性。
可以打印出来:
#include <stdio.h>
int main() {int a = 0;a = 30;printf("%d\n",a);//30return 0;
}
#include <stdio.h>
int main()
{int num = 23;printf("%d\n",num);num = 566;printf("%d\n",num);return 0;
}
打印不出来了:
#include <stdio.h>
int main() {const int a = 0;a = 30;//报错,左值指定const常对象,不能被修改,编译器不让你改//此时,a具有常量的属性,常属性printf("%d\n",a);//30return 0;
}
int main() {int a = 10;a = 20;//a是变量const int b = 30;//b是常变量b = 40;//报错return 0;
}
#include <stdio.h>
int main()
{//const指的是常属性(常量的属性)const int num = 23;//num就是const修饰的常变量 num本质上还是一个变量,只是具有常属性而已printf("%d\n",num);num = 566;//error 左值指定的const对象,表达式必须1是可修改的左值printf("%d\n",num);return 0;
}
总结:在C语言中,const修饰的a,本质是变量,但是不能直接修改,有常量的属性。
证明是常变量:
#include <stdio.h>
int main()
{int arr[10] = { 0 };//ok 创建数组的正确方式int n = 10;//int arr[n] = { 0 };//error 创建数组的错误方式 应输入常量表达式//const int n = 10;//errorreturn 0;
}
2.3 define定义的标识符常量
可以打印:
#include <stdio.h>
//定义一个符号MAX,值为100。以后遇到MAX,就是100。
//MAX是一个标识符,标识一个符号的。类似学号和姓名绑定。
#define MAX 100//MAX是没有类型的,也可以定义为字符串、其他符号等。
#define STR "abcdef"
int main() {printf("%d\n", MAX);//100int a = MAX;printf("a=%d\n", MAX);//a=100//%s是打印字符串的printf("ret=%s\n", STR);//ret=abcdefreturn 0;
}
#define定义的标识符常量(符号常量) :
#include <stdio.h>
//#define 定义的标识符常量 define定义
#define MAX 10//定义了符号MAX MAX=10 MAX就是一个标识符常量
#define PI 3.14//命令行,其值不可以在后面直接赋值(例如:PI = 5 错误赋值,违背了符号常量的性质)
#define PI 4//但是可以这样进行赋值int main()
{int arr[MAX] = {0};//不会报错,说明MAX是一个常量printf("%d\n",MAX);//10return 0;
}
define定义的标识符常量,也是不能改的:
#include <stdio.h>
#define MAX 100
int main() {MAX = 300;//报错,左操作数必须为左值return 0;
}
2.4 枚举常量
枚举常量:一一列举
- eg. 性别枚举出来就是:男、女、保密
- eg. 三原色:红、黄、蓝
- eg. 星期:1,2,3,4,5,6,7
- 枚举关键字:enum
创建一个Color类型的颜色变量,叫c,并予赋值为RED:
//定义枚举类型,关键词是enum,只是一个类型,不会开辟空间
//定义enum Color 这样的枚举类型
enum Color {//Color未来取值可能有如下三种(三原色),这三个取值就是列举出来的枚举常量RED,GREEN,//一般define定义的符号、枚举常量,可习惯的写为大写。BLUE//未来可能取到的值,枚举出来的
};
int main() {//printf("ret=%s\n", STR);enum Color c = RED;//使用enum Color类型创建变量,向内存申请并开辟空间return 0;
}
枚举常量不能被修改:
enum Sex {MALE,FAMALE,SECRET//枚举常量
};
int main() {enum Sex name = MALE;MALE = 10;//报错return 0;
}
#include <stdio.h>
enum Sex
{MAL,//枚举常量————不可改变FEMAL,SECRET//枚举常量
};
int main()
{printf("%d\n",MAL);//0printf("%d\n",FEMAL);//1printf("%d\n",SECRET);//2enum Sex s = MAL;//该人是男生return 0;
}
枚举常量是有值的,0、1、2、3、4……
是可以打印出来的。
#include <stdio.h>
enum Color
{//一一列举出来red,yellow,//枚举常量blue
};
int main()
{printf("red\n",red);//redenum Color color = blue;//该颜色是蓝色color = yellow;//枚举类型创建出来的变量是可以改变的,用变量接后可以改printf("该颜色是: %d", color);//该颜色是: 1//blue = 9999; 枚举常量直接不能修改。本身改变不了return 0;
}
枚举常量是有值,从0开始,1、2、3、4……
案例展示:
#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 100printf("max = %d\n", MAX);//枚举常量演示printf("%d\n", MALE);printf("%d\n", FEMALE);printf("%d\n", SECRET);//注:枚举常量的默认是从0开始,依次向下递增1的return 0;
}
注意:上面例子上的 pai 被称为 const 修饰的常变量, const 修饰的常变量在C语言中只是在语法层面限制了 变量 pai 不能直接被改变,但是 pai 本质上还是一个变量的,所以叫常变量。