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
 */

image-20241129235637741

二、变量的分类

☆ 局部变量

☆ 全局变量

1、局部变量

大括号内部{}定义的变量都被局部变量

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>

int main()
{
	/* 局部变量 a */
	int a = 10;
	printf("%d\n", a);

	return 0;
}

image-20241130000955108

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;
}

image-20241130001424496

【问】上述代码打印信息为什么是 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;
}

image-20241130003402351

(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;
}

image-20241130004458459

(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;
}

image-20241130004926643

想要一劳永逸的解决此问题,详见:软件配置

三、变量的作用域

作用域(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;
}

image-20241130121620455

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;
}

image-20241130122406589

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;
}

image-20241130122730790

(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;
}

image-20241130122618607

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;
}

image-20241130132815958

(2)证明(全局变量的作用域)

全局变量作用域整个工程

(3)求证(全局变量的作用域)

【1】add源文件

image-20241130133920584

#define _CRT_SECURE_NO_WARNINGS 1

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

image-20241130134001047

#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】运行结果

image-20241130134314351

四、变量的生命周期

变量生命周期指的是变量的创建变量的销毁之间的一个时间段。

1、局部变量生命周期

局部变量生命周期进入局部范围生命周期开始出局部范围生命周期结束

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>

int main()
{
	{/* 局部变量 a 的生命周期开始处 */
        
        /* 局部变量 a */
		int a = 100;
		printf("%d\n", a);
        
	}/* 局部变量 a 的生命周期结束处 */

	return 0;
}

image-20241130134951308

2、全局变量生命周期

全局变量生命周期是:整个程序生命周期

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>

/* 全局变量 a */
int a = 10;

int main()
{/* 全局变量 a 的生命周期开始处 */
		
	printf("%d\n", a);

	return 0;
    
}/* 全局变量 a 的生命周期结束处 */

image-20241130135208581

五、常量

不变为常量

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;
}

image-20241130141827512

(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;
}

image-20241130142248149

(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;
}

image-20241130143435840

【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;
}

image-20241130143716610

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;
}

image-20241130144231555

(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;
}

image-20241130144701419

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;
}

image-20241130145946457

(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;
}

image-20241130150239407

(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;
}

image-20241130150543535

posted @ 2024-12-05 13:28  AK47YHAO  阅读(46)  评论(0)    收藏  举报