04-变量与常量
04-变量与常量
一、创建变量的语法
①[类型] [变量名称] = [数值(字符、字符串)];
【注】推荐此创建变量的语法!
②[类型] [变量名称];
【注】不推荐此创建变量的语法!
【C语言描述】变量能被改变的量。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int age = 20;
double weight = 75.3;
age = age + 1;
weight = weight - 10;
printf("age:%d\n", age);
/* 单精度浮点型变量打印使用:%f;双精度浮点型变量打印使用:%lf */
printf("weight:%lf\n", weight);
return 0;
}
/*
* %d ----- 整型
* %f ----- float
* %lf ----- double
*/

二、变量的分类
☆ 局部变量
☆ 全局变量
1、局部变量
在大括号内部({})定义的变量都被称为局部变量。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
/* 局部变量 a */
int a = 10;
printf("%d\n", a);
return 0;
}

2、全局变量
在大括号外部({})定义的变量都被称为全局变量。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
/* 全局变量 */
int a = 100;
int main()
{
/* 局部变量 a */
int a = 10;
printf("%d\n", a);
return 0;
}

【问】上述代码打印信息为什么是 10 ,而不是 100 呢?
【答】当局部变量和全局变量的名字冲突的时候,局部优先。
【注】在编写代码时,不建议将局部变量和全局变量的名字写成一样!
3、变量的使用
【题】编写代码,求取两个整数的和。
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
int sum = 0;
/* scanf 函数是输入函数 */
scanf("%d %d", &a, &b);
sum = a + b;
printf("sum = %d\n", sum);
return 0;
}

(1)报错
编译器为什么报错了?
(2)报错内容(scanf)
错误 C4996 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
(3)报错内容解析(scanf)
VS2022告知这个scanf函数不安全,不建议使用。请使用scanf_s来替换scanf。如果使用scanf还不想出现这个错误警告,请使用_CRT_SECURE_NO_WARNINGS。
(4)解决方法一(scanf)
将_CRT_SECURE_NO_WARNINGS进行宏定义然后放入代码的第一行开头的位置。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
int sum = 0;
/* scanf 函数是输入函数 */
scanf("%d %d", &a, &b);
sum = a + b;
printf("sum = %d\n", sum);
return 0;
}

(5)解决方法二(scanf)
用scanf_s来替换scanf。
【注】不建议使用scanf_s函数,原因:这是VS编译器提供的,不是C语言标准规定的!
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
int sum = 0;
/* scanf 函数是输入函数 */
scanf_s("%d %d", &a, &b);
sum = a + b;
printf("sum = %d\n", sum);
return 0;
}

想要一劳永逸的解决此问题,详见:软件配置。
三、变量的作用域
作用域(scope),程序设计概念,通常来说,一段程序代码中所用到的名字并不总是有效或者可用的而限定这个名字的可用性的代码范围就是这个名字的作用域。
【注】变量在哪里起作用哪里就是变量的作用域!
1、示例
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
printf("hehe\r\n");
int a = 10;
printf("%d\n", a);
return 0;
}

2、对比
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
printf("hehe\r\n");
printf("%d\n", a);
{
int a = 10;
}
return 0;
}

3、局部变量作用域
局部变量的作用域是变量所在的局部范围 。
(1)示例
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
printf("hehe\r\n");
{
int a = 10;
printf("%d\n", a);
}
return 0;
}

(2)对比
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
printf("hehe\r\n");
{
int a = 10;
}
printf("%d\n", a);
return 0;
}

4、全局变量作用域
全局变量的作用域是整个工程 。
(1)示例
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
/* 全局变量 */
int g_val = 2022;
int main()
{
printf("g_val_1: %d\r\n", g_val);
printf("hehe\r\n");
{
printf("g_val_2: %d\r\n", g_val);
int a = 10;
printf("%d\n", a);
}
printf("g_val_3: %d\r\n", g_val);
return 0;
}

(2)证明(全局变量的作用域)
全局变量的作用域是整个工程。
(3)求证(全局变量的作用域)
【1】add源文件

#define _CRT_SECURE_NO_WARNINGS 1
/* 全局变量 */
int g_val = 2022;
【2】test源文件

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
/* 声明变量 */
extern int g_val;
int main()
{
printf("g_val: %d\r\n", g_val);
return 0;
}
【3】运行结果

四、变量的生命周期
变量的生命周期指的是变量的创建到变量的销毁之间的一个时间段。
1、局部变量生命周期
局部变量的生命周期:进入局部范围生命周期开始 ,出局部范围生命周期结束 。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
{/* 局部变量 a 的生命周期开始处 */
/* 局部变量 a */
int a = 100;
printf("%d\n", a);
}/* 局部变量 a 的生命周期结束处 */
return 0;
}

2、全局变量生命周期
全局变量的生命周期是:整个程序的生命周期 。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
/* 全局变量 a */
int a = 10;
int main()
{/* 全局变量 a 的生命周期开始处 */
printf("%d\n", a);
return 0;
}/* 全局变量 a 的生命周期结束处 */

五、常量
不变的量称为常量。
C语言中的常量和变量的定义的形式有所差异。
C语言中的常量分为以下几种:
☆ 字面常量
☆ const 修饰的常变量
☆ #define 定义的标识符常量
☆ enum 枚举常量
1、字面常量
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
30; //整型字面常量
3.14; //浮点型字面常量
/* 单引号(英文)引起的 */
'$'; //字符常量
/* 双引号(英文)引起的 */
"abcdef"; //字符串常量
return 0;
}
2、const 修饰的常变量
const 修饰的常变量:具有常属性(不能改变的属性),但是本质上是变量。
【注】const 修饰的常变量是无法进行改变的!
(1)示例
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int num = 10; //变量
num = 20; //变量是可变的
printf("%d\n", num);
return 0;
}

(2)比对
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
/* const 修饰后变量 num */
const int num = 10; //此时 num 是常变量
/* const 修饰后变量 num 是不可改变的 */
num = 20; //变量不可改变
printf("%d\n", num);
return 0;
}

(3)证明(本质)
const 修饰的常变量在本质上是变量。
(4)求证(本质)
【1】示例
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
/* 10个元素数组 */
int arr[10] = { 0 };
/* 变量 n 为 10 */
int n = 10;
/* 目的:10个元素数组 */
int arr2[n] = { 0 }; //定义出错
return 0;
}

【2】对比
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
/* 10个元素数组 */
int arr[10] = { 0 };
/* 常变量 n 为 10 */
const int n = 10;
/* 目的:10个元素数组 */
int arr2[n] = { 0 }; //定义出错
return 0;
}

3、#define 定义的标识符常量
【注】#define 定义的标识符常量是不能被改变的!!!
(1)示例
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#define MAX 10000
int main()
{
/* 定义变量 n 并赋值为 MAX */
int n = MAX;
printf("n = %d\n", n);
return 0;
}

(2)对比
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#define MAX 10000
int main()
{
/* 将 MAX 值重新赋值为 20000 */
MAX = 20000; //MAX值不能被改变
/* 定义变量 n 并赋值为 MAX */
int n = MAX;
printf("n = %d\n", n);
return 0;
}

4、enum 枚举常量
枚举常量:可以一一列举的常量。
枚举常量是常量,它的值是从 0 开始的(默认),但是可以赋初值。
【注】枚举类型中放的可能取值就是枚举常量(枚举:一一列举)!
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
/*
* --- enum 是枚举关键字,定义类型是 Color --- *
* 将枚举的可能取值给一一例举出来(只能是列举出来的才能使用)
* 三原色(枚举常量)
* R:红色
* G:绿色
* B:蓝色
*/
enum Color
{
RED,
GREEN,
BLUE
};
int main()
{
enum Color r = RED;
printf("r = %d\n", r);
enum Color g = GREEN;
printf("g = %d\n", g);
enum Color b = BLUE;
printf("b = %d\n", b);
return 0;
}

(1)示例(调用)
在调用时是不能更改的。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
/*
* --- enum 是枚举关键字,定义类型是 Color --- *
* 将枚举的可能取值给一一例举出来(只能是列举出来的才能使用)
* 三原色(枚举常量)
* R:红色
* G:绿色
* B:蓝色
*/
enum Color
{
RED,
GREEN,
BLUE
};
int main()
{
enum Color r = RED;
RED = 5;
printf("r = %d\n", r);
enum Color g = GREEN;
printf("g = %d\n", g);
enum Color b = BLUE;
printf("b = %d\n", b);
return 0;
}

(2)对比(赋初值)
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
/*
* --- enum 是枚举关键字,定义类型是 Color --- *
* 将枚举的可能取值给一一例举出来(只能是列举出来的才能使用)
* 三原色(枚举常量)
* R:红色
* G:绿色
* B:蓝色
*/
enum Color
{
RED = 3, //赋初值
GREEN,
BLUE
};
int main()
{
enum Color r = RED;
printf("r = %d\n", r);
enum Color g = GREEN;
printf("g = %d\n", g);
enum Color b = BLUE;
printf("b = %d\n", b);
return 0;
}


浙公网安备 33010602011771号