单片机之从C语言基础到专家编程 - 4 C语言基础 - 4.9 变量与常量
基本数据类型可以作为变量与常量使用,顾名思义,变量运行时可以改变其值,常量运行时不会改变其值。
常量分为整型常量、浮点型常量、字符常量、字符串常量和符号常量。
通常用#define来定义一个标识符来表示一个常量
用type name = 常量来定义一个变量, 变量可以理解成一个容器,可以乘装不同的常量,也可以理解成计算机为name这个标识符开辟的一个个以字节为单位的小格子,小格子的数量就是变量类型type所占据的存储空间。每个小格子里的内容依次是当前所装载的常量数据的字节流
1 整型常量与变量
1)十进制整数
如自然数:
#define CONSTANT_MAX_BUF_LEN_DEC 128
int maxBufLenDec = CONSTANT_MAX_BUF_LEN_DEC;
其中,CONSTANT_MAX_BUF_LEN_DEC为整型常量十进制整数128,maxBufLenDec为变量
2)八进制整数
八进制的数表示为前面带“0”的数。如
#define CONSTANT_MAX_BUF_LEN_OCT O200
int maxBufLenOct = CONSTANT_MAX_BUF_LEN_OCT;
其中,CONSTANT_MAX_BUF_LEN_OCT为整型常量八进制整数O200,maxBufLenOct为变量
3)十六进制数
与八进制不同,十六进制整数以“0x”开头,如:
#define CONSTANT_MAX_BUF_LEN_HEX 0x80
int maxBufLenHex = CONSTANT_MAX_BUF_LEN_HEX;
其中,CONSTANT_MAX_BUF_LEN_HEX为整型常量十六进制整数0x80,maxBufLenHex为变量
4)二进制数
与八进制不同,二进制整数以“0b”开头,如:
#define CONSTANT_MAX_BUF_LEN_BIN 0b10000000
int maxBufLenBin = CONSTANT_MAX_BUF_LEN_BIN;
其中,CONSTANT_MAX_BUF_LEN_BIN为整型常量二进制整数0b10000000,maxBufLenBin为变量
注意:KEIL编译器C99并不支持二进制整数的表示与输出,使用以上代码编译时会报错:expected a “;”
所以,一般我们并不直接使用二进制数作为常量给变量赋值,而是使用十六进制,如果非要考虑使用二进制位来表示数据,可以考虑使用位域,后期会专门讲解,此处不做展开。
2 浮点型常量与变量
浮点型常量以“f”结尾
#define CONSTANT_PI 3.141592f
float pi = CONSTANT_PI;
其中,CONSTANT_PI为浮点型常量3.141592f,pi为变量
3 字符常量与变量
用单引号界定起来的一个普通字符或转义字符,如: ‘a’、‘A’、‘\n‘、'\t’等。
普通字符可以是字符集中任意一个字符。普通字符常量的值就是该字符的ASCII值。
转义字符是一种特殊的字符常量,以反斜线“\”开头,后跟一个或几个字符,主要用来表示那些无法输出的控制字符或者特殊字符。
转义字符对照表
转义字符 | 意义 | ASCLL码值(十进制) |
---|---|---|
\a | 响铃(BEL) | 007 |
\b | 退格(BS) ,将当前位置移到前一列 | 008 |
\f | 换页(FF),将当前位置移到下页开头 | 012 |
\n | 换行(LF) ,将当前位置移到下一行开头 | 010 |
\r | 回车(CR) ,将当前位置移到本行开头 | 013 |
\t | 水平制表(HT) (跳到下一个TAB位置) | 009 |
\v | 垂直制表(VT) | 011 |
\’ | 代表一个单引号’ | 039 |
\" | 代表一个双引号字符" | 034 |
\\ | 代表一个反斜线字符’\’ | 092 |
? | 代表一个问号? | 063 |
\0 | 空字符(NUL) | 000 |
\ddd | 1到3位八进制数所代表的任意字符 | 三位八进制 |
\xhh | 十六进制所代表的任意字符 | 十六进制 |
#define CONSTANT_ENTER '\n'
char word = CONSTANT_ENTER;
其中,CONSTANT_ENTER为字符常量’\n’,word为字符变量。
4 字符串常量与变量
用一对双引号括起来的一个字符序列,如:“Hello World”、“Master"、“n”、"$1000”等。
存储:系统自动在字符串常量后面加上“\0”作为字符串结束标志。
#define CONSTANT_HELLO "Hello World\n"#define CONSTANT_MASTER "Master"char* words = CONSTANT_HELLO;words = CONSTANT_MASTER;
其中,CONSTANT_HELLO为字符串常量"Hello World\n",CONSTANT_MASTER为字符串常量"Master"。
使用了char* words定义了字符串变量,其本质是一个字符指针。这里相当与将CONSTANT_HELLO及CONSTANT_MASTER的首地址赋值给字符指针words。
5 符号常量
使用**#define宏定义**,前面所述的用标识符替换各常量的表示就是符号常量。
通常将符号常量放在头文件中,然后在源文件函数中调用。
6 变量
1)变量的定义和申明
变量的定义:变量必须经过定义才能使用,变量的定义即为变量开辟内存空间,开辟空间的大小即为变量类型所占的大小。变量的值的范围以变量类型的空间大小和及符号位所决定。同一作用域变量只能定义一次。变量在源文件中定义,永远不要在头文件中定义变量。
int a; //定义一个整型变量a
float b; //定义一个浮点型变量b
double c; //定义一个双精度型变量c
char d; //定义一个字符变量d
char* p; //定义一个字符指针变量p
void test(void)
{int sizeOfA = sizeof(a); int sizeOfB = sizeof(b);int sizeOfC = sizeof(c);int sizeOfD = sizeof(d);int sizeOfP = sizeof(p);printf("size of a = %d",sizeOfA); //size of a = 4printf("size of b = %d",sizeOfB); //size of b = 4printf("size of c = %d",sizeOfC); //size of c = 8printf("size of d = %d",sizeOfD); //size of a = 1printf("size of p = %d",sizeOfP); //size of p = 4
}
变量的申明:加上extern关键字的变量即为变量声明,同一作用域变量可声明多次。变量可在源文件中声明,也可在头文件中声明(用作外部变量)
extern int a; //申明一个整型变量a
extern float b; //申明一个浮点型变量b
extern double c; //申明一个双精度型变量c
extern char d; //申明一个字符变量d
extern char* p; //申明一个字符指针变量p
2)变量的初始化
变量定义后,还需要初始化,否则其值会得到预期外的结果。
a = 1024;b = 0.001024;c = 0.0000001024;d = '\n';p = "Hello World";
3)变量的使用和赋值
变量初始化后,通过直接调用变量可得到变量的值。
printf("a = %d",a);printf("b = %f",b);printf("c = %lf",c);printf("d = %c",d);printf("p = %s",p);
4)变量的作用范围
变量在哪里定义的,其作用范围就在哪里,如果超出这个作用范围,就会得到变量未定义的错误。作用范围就是{}内部代码块的范围
如
{int i = 0;}i += 1;// identifier "i" is undefined
5)全局变量与局部变量
在源文件中函数外定义的变量就是全局变量
在函数中定义的变量就是局部变量。
6)静态变量与动态变量
通过static修饰的变量就是静态变量
静态变量用作全局变量时,它在整个当前源文件都是可见的,而在文件之外是不可见的,在头文件中使用extern声明会得到变量未定义的错误。去掉static修饰,变量用extern就可以访问了。
静态变量用作局部变量时,在程序执行到该变量的定义处时被首次初始化,以后的函数调用不再进行初始化;
动态变量在函数中,每次调用函数都会从初始值开始赋值。
int addTest(int i)
{static int sum = 0;sum += i;return sum;}int add(int i)
{int sum = addTest(i);return sum;
}void testAdd()
{int sum = 0;for (int i = 0 ; i < 100 ; i++){sum = add(i + 1);}printf("sum = %d",sum); //sum = 5050}
7)常变量
变量用const修饰时,就是常变量
常变量指定义时必须显示初始化且值不可修改的变量。与其他变量一样被分配空间,是可以寻址的。注意,字符串常量是常变量的一种,名称为其本身,因为其存储在静态存储区的常量区,可寻址,不可修改。
常变量和常量的区别是:
常量不开辟内存空间。在预编译时就全部由符号常量的值替换了,⽽常变量占⽤内存空间,只是此变量在存在期间不能重新赋值。
常量在计算机运行时,不会被程序修改的量,常变量是在运行时被计算机赋予的值,其值不是唯一的。
相关文章:
单片机之从C语言基础到专家编程 - 4 C语言基础 - 4.9 变量与常量
基本数据类型可以作为变量与常量使用,顾名思义,变量运行时可以改变其值,常量运行时不会改变其值。 常量分为整型常量、浮点型常量、字符常量、字符串常量和符号常量。 通常用#define来定义一个标识符来表示一个常量 用type name 常量来定义一个变量,…...

如何在 3dmax 中渲染? 3dmax渲染教程
3D Max是一款专业的3D计算机设计软件,用于创建3D动画、游戏、模型、图像等,在视频游戏开发商、电影和电视工作室的工作中发挥着重要作用。渲染是 3D max 建模的一个非常重要的部分。在渲染中,通过设置渲染选项的一些参数,我们可以…...
linux部署项目, 报数据库连接不上错误
问题描述: sprinboot项目, 本地连线上数据库可以使用, springboot项目中java包的版本是8.0, 线上数据库是5.7, 但在将项目部署到服务器上的时候发现项目启动报错, 于是寻找问题, 发现是useSSLtrue导致的 出问题前的链接地址: url: jdbc:mysql://localhost:3306/ja…...

现有的vue3+ts+vite项目集成electron
效果图 什么时Electron Electron是使用JavaScript,HTML和CSS构建跨平台的桌面应用程序框架。 Electron兼容Mac、Windows和Linux,可以构建出三个平台的应用程序。 现有的vue3项目集成Electron 安装依赖 原来有一个vue3+ts+vite+pnpm的项目,其中sub-modules是子项目,web是…...

线性代数的学习和整理8: 方阵和行列式相关(草稿-----未完成)
1.4.1 方阵 矩阵里,行数列数的矩阵叫做方阵方阵有很多很好的特殊属性 1.4.2 行列式 行列式是方阵的一种特殊运算如果矩阵行数列数相等,那么这个矩阵是方阵。行列数的计算方式和矩阵的不同只有方阵才有行列式行列式其实是,矩阵变化的一个面…...
Ubuntu vi 左下角没有提示
1 打开终端,输入以下命令 sudo gedit /etc/vim/vimrc.tiny 2 进入文件后,修改 set compatible 为set nocompatible,如下所示: " Vim configuration file, in effect when invoked as "vi". The aim of this "…...

Windows安装 Elasticsearch 教程
下载地址 Past Releases of Elastic Stack Software | Elastic 解压 解压完的样子 进入BIN目录 D:\Develop\elasticsearch\elasticsearch-7.12.0\bin 按住shift 鼠标右键 打开 powershell 窗口 查看ES版本 .\elasticsearch.bat --version 出现问题了 警告:不赞成…...

Dubbo 融合 Nacos 成为注册中心
快速上手 Dubbo 融合 Nacos 成为注册中心的操作步骤非常简单,大致步骤可分为“增加 Maven 依赖”以及“配置注册中心“。 增加 Maven 依赖 只需要依赖Dubbo客户端即可,关于推荐的使用版本,请参考Dubbo官方文档或者咨询Dubbo开发人员&#…...

kafka--kafka基础概念-ISR详解
kafka基础概念-ISR详解 主要是讲 主 往 从同步中的问题 当绿色P1接收到写入的数据,要同步到紫色的P1S1和P1S2 如何保证一致性呢? 使用In Sync Replicas 也就是ISR概念 为什么不一致的? 因为P1S1同步数据 可能花费 50ms P1S2可能花费60ms…...

《Kubernetes部署篇:Ubuntu20.04基于外部etcd+部署kubernetes1.24.16集群(多主多从)》
一、架构图 如下图所示: 二、环境信息 1、部署规划 主机名K8S版本系统版本内核版本IP地址备注k8s-master-631.24.16Ubuntu 20.04.5 LTS5.15.0-69-generic192.168.1.63master节点 + etcd节点k8s-master-641.24.16Ubuntu 20.04.5 LTS5.15.0-69-generic192.168.1.64master节点 + …...
音频解码及如何在Java实现
本人并不干这个,但是被迫下水了解了一下这个,稍微做了一下整理。再就是感觉现在网上以及ChatGPT在这方面给出的答案太水了,在此开辟一篇。无意放出代码,这里只介绍一些可能重要的点。 本来以为有了ChatGPT写这些就没有必要了&…...
Webshell 及检测绕过
webshell 概念 web指的是在web服务器上,而shell是用脚本语言编写的脚本程序,WebShell是一种用来进行网站和服务器管理的脚本程序,webshell一般是被网站管理员用于网站管理、服务器管理等等一些用途,但是由于webshell的功能比较强大࿰…...
Ubuntu22.4系统mongodb数据库安装
Ubuntu22.4系统mongodb数据库安装 1、打开终端并运行以下命令,以导入 MongoDB GPG 密钥: wget -qO - https://www.mongodb.org/static/pgp/server-5.0.asc | sudo apt-key add -2、添加 MongoDB 仓库到你的系统。根据你的 Ubuntu 版本,选择…...

Vue初识别--环境搭建--前置配置过程
问题一: 在浏览器上的扩展程序上添加了vue-devtools后不生效: 解决方式:打开刚加入的扩展工具Vue.js devtools的允许访问文件地址设置 问题二:Vue新建一个项目 创建一个空文件夹hrsone,然后在VSCode中打开这个空文件夹…...

数据在内存中的储存·大小端(文字+画图详解)(c语言·超详细入门必看)
前言:Hello,大家好,我是心跳sy😘,本节我们介绍c语言的两种基本的内置数据类型:数值类型和字符类型在内存中的储存方法,并对大小端进行详细介绍(附两种大小端判断方法)&am…...

Word怎么转换成PDF文档?多个Word转换成PDF步骤分享
word文档是一种非常好用的文件格式,可以帮助用户们很好的保存图片和文字内容,不过并不是只有word这一种文档类文件格式,还有一种pdf文档也深受用户们的欢迎,在工作或者学习过程中这两种文档是可以互相转换格式的,那么W…...

【C++习题集】-- 堆
(用于复习) 目录 树概念及结构 名词概念 二叉树概念及结构 特殊的二叉树 满二叉树 完全二叉树 运算性质 二叉树存储结构 顺序存储 链式存储 堆 - 顺序存储 堆的性质 堆的实现 堆的应用 堆排序 直接建堆法 树概念及结构 概念:…...

vue + vue-office 实现多种文件(docx、excel、pdf)的预览
支持多种文件( docx、excel、pdf)预览的vue组件库,支持vue2/3。也支持非Vue框架的预览。 github: 《仓库地址》 演 示: 《演示效果》 功能特色 一站式:提供docx、pdf、excel多种文档的在线预览方案,有它就够了简单:…...

30.Netty源码服务端启动主要流程
highlight: arduino-light 服务端启动主要流程 •创建 selector •创建 server socket channel •初始化 server socket channel •给 server socket channel 从 boss group 中选择一个 NioEventLoop •将 server socket channel 注册到选择的 NioEventLoop 的 selector •…...

ssh端口转发
在本地客户端操作: ssh远程连接一段时间会失效的问题 vim /etc/ssh_config或vim /etc/ssh/ssh_config 在末尾添加ServerAliveInterval 30,意思是30s会发送一次向服务器连接的请求,以保持会话始终在线 验证: 放一段时间不操作,…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...

ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

短视频矩阵系统文案创作功能开发实践,定制化开发
在短视频行业迅猛发展的当下,企业和个人创作者为了扩大影响力、提升传播效果,纷纷采用短视频矩阵运营策略,同时管理多个平台、多个账号的内容发布。然而,频繁的文案创作需求让运营者疲于应对,如何高效产出高质量文案成…...

【C++进阶篇】智能指针
C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...
站群服务器的应用场景都有哪些?
站群服务器主要是为了多个网站的托管和管理所设计的,可以通过集中管理和高效资源的分配,来支持多个独立的网站同时运行,让每一个网站都可以分配到独立的IP地址,避免出现IP关联的风险,用户还可以通过控制面板进行管理功…...

9-Oracle 23 ai Vector Search 特性 知识准备
很多小伙伴是不是参加了 免费认证课程(限时至2025/5/15) Oracle AI Vector Search 1Z0-184-25考试,都顺利拿到certified了没。 各行各业的AI 大模型的到来,传统的数据库中的SQL还能不能打,结构化和非结构的话数据如何和…...