当前位置: 首页 > news >正文

【C语言】一篇文章彻底搞懂变量和常量

变量和常量

    • 1 前言
    • 2 预备知识
      • 2.1 printf和%d
      • 2.2 \n
      • 2.3 scanf输入
      • 2.4 scanf在vs中报错
        • 2.4.1 如何找到newc++file.cpp
        • 2.4.2 打开后修改不了,因为权限不够
          • 2.4.2.1 解决方法一
          • 2.4.2.2 解决方法二
      • 2.5 extern
      • 2.6 数组的初始化
    • 3 变量和常量的区别
    • 4 变量
      • 4.1 定义变量的方法
      • 4.2 变量的分类
        • 4.2.1 局部优先
      • 4.3 变量的使用
      • 4.4 变量的作用域
        • 4.4.1 局部变量的作用域
        • 4.4.2 全局变量的作用域
      • 4.5 变量的生命周期
        • 4.5.1 局部变量的生命周期
        • 4.5.2 全局变量的生命周期
    • 5 常量
      • 5.1 字面常量
      • 5.2 const修饰的常变量
      • 5.3 #define定义的标识符常量
      • 5.4 枚举常量

1 前言

欢迎收看有手就行C语言系列,我是努力学习游泳的鱼。我之前也写过一个系列的C语言教程,不过自我感觉写的还有较大的进步空间,所以重置了这一版,希望讲解得更加通俗易懂,大伙如果喜欢的话可以点赞收藏评论支持一下博主,如果关注一下的话就更好啦。

2 预备知识

2.1 printf和%d

#include <stdio.h>

int main()
{
	int a = 100;
	printf("a = %d\n", a);
	
	return 0;
}

这段代码会输出a = 100
因为a = %d中,%d表示打印整数,会被直接替换成a的值,即100。

2.2 \n

\n是一个转义字符,表示换行

2.3 scanf输入

scanf是C语言的库函数,对应的头文件是stdio.h
和printf相反,scanf用来完成从键盘中输入数据的操作,
使用时注意在变量名前面加上&,这点初学者容易忘记。

#include <stdio.h>

int main()
{
	int a = 0;
	scanf("%d", &a); // 注意不能漏掉&
	
	return 0;
}

2.4 scanf在vs中报错

如果你使用的是visual studio系列的编译器,需要在程序的第一行加上一行代码才能使用scanf

#define _CRT_SECURE_NO_WARNINGS 1

如果你不嫌麻烦可以每次都加上这行代码。
如果你不想每次都写这行代码,可以在vs的安装路径找到newc++file.cpp文件,在里面加上这行代码即可。当然你也可以研究一下scanf的替代函数scanf_s,不过我不建议这么做。

2.4.1 如何找到newc++file.cpp

可以使用everything进行查找点这里下载

2.4.2 打开后修改不了,因为权限不够

有两种解决方法

2.4.2.1 解决方法一

把文件拖到桌面,修改后再放回去。

2.4.2.2 解决方法二

复制文件路径,管理员权限打开记事本,再打开文件路径就行了

2.5 extern

extern是用来声明外部符号的。任何变量或函数使用前都要先声明或者定义,如果这个函数或者变量在其他文件内,则可以使用extern声明。

2.6 数组的初始化

这里只需要明白,下面代码方括号里的10必须是个常量(不变的量)就行了。

int arr[10] = {0};

3 变量和常量的区别

会改变的量,叫做变量。
不会改变的量,叫做常量。

4 变量

4.1 定义变量的方法

类型+名字(+初始化)

int age = 10;
char ch = 'w';

4.2 变量的分类

变量分为全局变量和局部变量。
定义在大括号外部的变量叫做全局变量。
定义在大括号内部的变量叫做局部变量。

int b = 1000; // 全局变量 - 定义在大括号外面

int main()
{
	int a = 100; // 局部变量 - 定义在大括号里面

	return 0;
}

4.2.1 局部优先

当全局变量和局部变量的名字冲突时,局部优先!

#include <stdio.h>

int a = 1000; // 全局变量

int main()
{
	int a = 100; // 局部变量
	printf("a = %d\n", a);
	
	return 0;
}

这里局部变量的a和全局变量的a名字冲突了,但是输出结果是a = 100。

不建议把全局变量和局部变量的名字取成一样的!

4.3 变量的使用

写一个代码,完成两个整数的相加

#include <stdio.h>

int main()
{
    int num1 = 0;
    int num2 = 0;
	int sum = 0;
		
	// 输入
	scanf("%d %d", &num1, &num2);

	// 求和
	sum = num1 + num2;

	// 输出
	printf("sum = %d\n", sum);
	
    return 0;
}

4.4 变量的作用域

一个变量哪里可以使用,哪里就是它的作用域。

4.4.1 局部变量的作用域

局部变量的作用域是变量所在的局部范围。

#include <stdio.h>

int main()
{
	{
		int a = 100; // 局部变量
		printf("%d\n", a); // 这里可以使用
	}

	printf("%d\n", a); // 这里不能使用

	return 0;
}

4.4.2 全局变量的作用域

全局变量的作用域是整个工程。

#include <stdio.h>

int a = 100; // 全局变量

void test()
{
	printf("test::%d\n", a); // 这里可以使用
}

int main()
{
	test();
	printf("main::%d\n", a); // 这里可以使用

	return 0;
}

全局变量甚至可以跨文件使用,但在使用前要使用extern声明。
test1.c

int a = 100; // 跨文件的全局变量

test2.c

#include <stdio.h>

extern int a; // extern是用来声明外部符号的

void test()
{
	printf("test::%d\n", a); // 可以使用
}

int main()
{
	test();
	printf("main::%d\n", a); // 可以使用

	return 0;
}

4.5 变量的生命周期

一个变量从创建到销毁的时间段就是它的生命周期。

4.5.1 局部变量的生命周期

进作用域生命周期开始,出作用域生命周期结束。

4.5.2 全局变量的生命周期

全局变量的生命周期和程序的生命周期相同。即:与程序共存亡!

5 常量

5.1 字面常量

直接写出来的常量就叫做字面常量。

20;
3.14;
'a'; // 字符常量
"abcdef"; // 字符串常量

字面常量可以给变量赋值或初始化。

int a = 10;
char ch = 'w';

5.2 const修饰的常变量

const是C语言的关键字,意思是常属性。

被const修饰的变量,具有常属性,在语法上不能改变,但本质上还是个变量
所以,我们称这种变量为常变量。

int main()
{
	const int a = 10;
	a = 20; // 不能像这样改变a的值了
	
	return 0;
}

下面证明const修饰的常变量本质是个变量。
数组初始化时方括号里必须是常量。

int arr[10] = {0};

那么const修饰的常变量能不能用来初始化数组时指定大小呢?

int main()
{
	const int n = 10;
	int arr[n] = {0}; // 这里会报错
	
    return 0;
}

答案是:不能!
由此可知,

在C语言里,const修饰的常变量只是具有常属性,但本质上是个变量,不能当做常量来处理。

5.3 #define定义的标识符常量

#include <stdio.h>

#define M 100 // 这里M就是一个常量

int main()
{
	int a = M; // M可以给变量赋值
	int arr[M] = {0}; // M可以在数组初始化时指定大小
	printf("a = %d\n", a);
	
	return 0;
}

5.4 枚举常量

C语言提供了一个关键字:enum,就是枚举的意思。

枚举,即一一列举。
生活中有些东西是可以一一列举的。比如:
性别:男,女,保密。
三原色:红色,绿色,蓝色。
星期:星期一,星期二,……,星期日。
C语言提供了枚举类型。

enum Sex // enum Sex就是一个枚举类型
{
	// 这里的MALE,FEMALE,SECRET就是枚举常量
	MALE,
	FEMALE,
	SECRET
}; // 分号不能省略

int main()
{
	enum Sex s = MALE; // 可以用枚举常量给枚举类型初始化或赋值
	
	return 0;
}

枚举常量也是有值的,默认从0开始。

#include <stdio.h>

enum Color
{
	RED, // 0
	GREEN, // 1
	BLUE // 2
};

int main()
{
	printf("%d %d %d", RED, GREEN, BLUE); // 输出0 1 2
	
    return 0;
}

相关文章:

  • CSS基础12-canvas
  • javascript时钟的开发制作
  • 应用层协议 —— HTTP(二)
  • Qt之QCompleter的简单使用(自动补全、文本框提示、下拉框提示含源码+注释)
  • MyBatis-Plus(二)
  • Linux-常见命令(三)
  • 【国庆活动】Spring Boot 必知必会的核心理念(二)
  • c++:程序流程结构,顺序结构,选择结构if else,三目运算符
  • 使用 Amazon Rekognition API 进行文本检测和 OCR
  • 内核驱动踩坑记录
  • 半导体中的杂质和缺陷能级
  • SSM毕设项目大学生心理咨询系统792l6(java+VUE+Mybatis+Maven+Mysql)
  • 嵌入式学习的第二天
  • R语言(4) plot函数介绍
  • JVM -- 垃圾回收器7种(四)
  • Angular Elements 及其运作原理
  • linux安装openssl、swoole等扩展的具体步骤
  • vagrant 添加本地 box 安装 laravel homestead
  • web标准化(下)
  • 复习Javascript专题(四):js中的深浅拷贝
  • 计算机常识 - 收藏集 - 掘金
  • 近期前端发展计划
  • 如何使用Mybatis第三方插件--PageHelper实现分页操作
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • 栈实现走出迷宫(C++)
  • ​Linux·i2c驱动架构​
  • ​TypeScript都不会用,也敢说会前端?
  • $(selector).each()和$.each()的区别
  • (9)STL算法之逆转旋转
  • (八)c52学习之旅-中断实验
  • (机器学习-深度学习快速入门)第一章第一节:Python环境和数据分析
  • (算法)求1到1亿间的质数或素数
  • (状压dp)uva 10817 Headmaster's Headache
  • .net core 6 使用注解自动注入实例,无需构造注入 autowrite4net
  • .NET Core引入性能分析引导优化
  • .NET Framework 的 bug?try-catch-when 中如果 when 语句抛出异常,程序将彻底崩溃
  • .NET Framework 服务实现监控可观测性最佳实践
  • .NET Standard 的管理策略
  • .NET 自定义中间件 判断是否存在 AllowAnonymousAttribute 特性 来判断是否需要身份验证
  • .NET/C# 使用 SpanT 为字符串处理提升性能
  • .Net高阶异常处理第二篇~~ dump进阶之MiniDumpWriter
  • .NET基础篇——反射的奥妙
  • .NET企业级应用架构设计系列之开场白
  • .NET项目中存在多个web.config文件时的加载顺序
  • .Net小白的大学四年,内含面经
  • ::before和::after 常见的用法
  • @JsonSerialize注解的使用
  • @media screen 针对不同移动设备
  • [@Controller]4 详解@ModelAttribute
  • [BIZ] - 1.金融交易系统特点
  • [BUG]Datax写入数据到psql报不能序列化特殊字符
  • [BUG]vscode插件live server无法自动打开浏览器
  • [bzoj1006]: [HNOI2008]神奇的国度(最大势算法)
  • [c]扫雷