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

单片机之从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
\ddd1到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 变量与常量

基本数据类型可以作为变量与常量使用,顾名思义&#xff0c;变量运行时可以改变其值&#xff0c;常量运行时不会改变其值。 常量分为整型常量、浮点型常量、字符常量、字符串常量和符号常量。 通常用#define来定义一个标识符来表示一个常量 用type name 常量来定义一个变量,…...

如何在 3dmax 中渲染? 3dmax渲染教程

3D Max是一款专业的3D计算机设计软件&#xff0c;用于创建3D动画、游戏、模型、图像等&#xff0c;在视频游戏开发商、电影和电视工作室的工作中发挥着重要作用。渲染是 3D max 建模的一个非常重要的部分。在渲染中&#xff0c;通过设置渲染选项的一些参数&#xff0c;我们可以…...

linux部署项目, 报数据库连接不上错误

问题描述: sprinboot项目, 本地连线上数据库可以使用, springboot项目中java包的版本是8.0, 线上数据库是5.7, 但在将项目部署到服务器上的时候发现项目启动报错, 于是寻找问题&#xff0c; 发现是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 方阵 矩阵里&#xff0c;行数列数的矩阵叫做方阵方阵有很多很好的特殊属性 1.4.2 行列式 行列式是方阵的一种特殊运算如果矩阵行数列数相等&#xff0c;那么这个矩阵是方阵。行列数的计算方式和矩阵的不同只有方阵才有行列式行列式其实是&#xff0c;矩阵变化的一个面…...

Ubuntu vi 左下角没有提示

1 打开终端&#xff0c;输入以下命令 sudo gedit /etc/vim/vimrc.tiny 2 进入文件后&#xff0c;修改 set compatible 为set nocompatible&#xff0c;如下所示&#xff1a; " 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 出现问题了 警告&#xff1a;不赞成…...

Dubbo 融合 Nacos 成为注册中心

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

kafka--kafka基础概念-ISR详解

kafka基础概念-ISR详解 主要是讲 主 往 从同步中的问题 当绿色P1接收到写入的数据&#xff0c;要同步到紫色的P1S1和P1S2 如何保证一致性呢&#xff1f; 使用In Sync Replicas 也就是ISR概念 为什么不一致的&#xff1f; 因为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实现

本人并不干这个&#xff0c;但是被迫下水了解了一下这个&#xff0c;稍微做了一下整理。再就是感觉现在网上以及ChatGPT在这方面给出的答案太水了&#xff0c;在此开辟一篇。无意放出代码&#xff0c;这里只介绍一些可能重要的点。 本来以为有了ChatGPT写这些就没有必要了&…...

Webshell 及检测绕过

webshell 概念 web指的是在web服务器上&#xff0c;而shell是用脚本语言编写的脚本程序&#xff0c;WebShell是一种用来进行网站和服务器管理的脚本程序,webshell一般是被网站管理员用于网站管理、服务器管理等等一些用途&#xff0c;但是由于webshell的功能比较强大&#xff0…...

Ubuntu22.4系统mongodb数据库安装

Ubuntu22.4系统mongodb数据库安装 1、打开终端并运行以下命令&#xff0c;以导入 MongoDB GPG 密钥&#xff1a; wget -qO - https://www.mongodb.org/static/pgp/server-5.0.asc | sudo apt-key add -2、添加 MongoDB 仓库到你的系统。根据你的 Ubuntu 版本&#xff0c;选择…...

Vue初识别--环境搭建--前置配置过程

问题一&#xff1a; 在浏览器上的扩展程序上添加了vue-devtools后不生效&#xff1a; 解决方式&#xff1a;打开刚加入的扩展工具Vue.js devtools的允许访问文件地址设置 问题二&#xff1a;Vue新建一个项目 创建一个空文件夹hrsone&#xff0c;然后在VSCode中打开这个空文件夹…...

数据在内存中的储存·大小端(文字+画图详解)(c语言·超详细入门必看)

前言&#xff1a;Hello&#xff0c;大家好&#xff0c;我是心跳sy&#x1f618;&#xff0c;本节我们介绍c语言的两种基本的内置数据类型&#xff1a;数值类型和字符类型在内存中的储存方法&#xff0c;并对大小端进行详细介绍&#xff08;附两种大小端判断方法&#xff09;&am…...

Word怎么转换成PDF文档?多个Word转换成PDF步骤分享

word文档是一种非常好用的文件格式&#xff0c;可以帮助用户们很好的保存图片和文字内容&#xff0c;不过并不是只有word这一种文档类文件格式&#xff0c;还有一种pdf文档也深受用户们的欢迎&#xff0c;在工作或者学习过程中这两种文档是可以互相转换格式的&#xff0c;那么W…...

【C++习题集】-- 堆

&#xff08;用于复习&#xff09; 目录 树概念及结构 名词概念 二叉树概念及结构 特殊的二叉树 满二叉树 完全二叉树 运算性质 二叉树存储结构 顺序存储 链式存储 堆 - 顺序存储 堆的性质 堆的实现 堆的应用 堆排序 直接建堆法 树概念及结构 概念&#xff1a…...

vue + vue-office 实现多种文件(docx、excel、pdf)的预览

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

30.Netty源码服务端启动主要流程

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

ssh端口转发

在本地客户端操作&#xff1a; ssh远程连接一段时间会失效的问题 vim /etc/ssh_config或vim /etc/ssh/ssh_config 在末尾添加ServerAliveInterval 30&#xff0c;意思是30s会发送一次向服务器连接的请求&#xff0c;以保持会话始终在线 验证: 放一段时间不操作&#xff0c;…...

独立站SEO是什么意思?自主网站SEO的含义?

什么是独立站SEO优化&#xff1f;自建站搜索引擎优化是指什么&#xff1f; 独立站SEO&#xff0c;作为网络营销的重要一环&#xff0c;正在逐渐引起人们的关注。在当今数字化时代&#xff0c;独立站已经成为许多企业、个人宣传推广的首选平台之一。那么&#xff0c;究竟什么是…...

Android JNI系列详解之NDK和JNI介绍

一、前提 针对自己在Android JNI和NDK这块技术的空白知识点,进行这个JNI系列的学习,记录这一阶段的学习。学习的主要步骤:从概念原理解析--->边学边实战--->从易到难,循序渐进。(学习这一阶段的前提:需要有Android开发基础) 学完JNI-NDK开发系列,达到的目的有:…...

LeetCode //C - 20. Valid Parentheses

20. Valid Parentheses Given a string s containing just the characters ‘(’, ‘)’, ‘{’, ‘}’, ‘[’ and ‘]’, determine if the input string is valid. An input string is valid if: Open brackets must be closed by the same type of brackets.Open bracke…...

浅析Java设计模式之四策略模式

title: 浅析Java设计模式之四策略模式 date: 2018-12-29 17:26:17 categories: 设计模式 description: 浅析Java设计模式之四策略模式 1. 目录 1. 目录2. 概念 2.1. 应用场景2.2. 优缺点 2.2.1. 优点2.2.2. 缺点 3. 模式结构4. 样例 4.1. 定义策略4.2. 定义具体策略4.3. 定义…...

基于Spring Boot的餐厅订餐网站的设计与实现(Java+spring boot+MySQL)

获取源码或者论文请私信博主 演示视频&#xff1a; 基于Spring Boot的餐厅订餐网站的设计与实现&#xff08;Javaspring bootMySQL&#xff09; 使用技术&#xff1a; 前端&#xff1a;html css javascript jQuery ajax thymeleaf 微信小程序 后端&#xff1a;Java springbo…...

【图像分割】理论篇(1)评估指标代码实现

图像分割是计算机视觉中的重要任务&#xff0c;用于将图像中的不同区域分割成具有语义意义的区域。以下是几种常用的图像分割评价指标以及它们的代码实现示例&#xff08;使用Python和常见的计算机视觉库&#xff09;&#xff1a; 1. IoU (Intersection over Union) 与目标检…...

Git checkout 某个版本到指定文件夹下

文章目录 场景说明方案一&#xff1a;git archive 最简单省事方案二&#xff1a;git show 最灵活, 但文件较多时麻烦方案三&#xff1a;git --work-tree 有bug 场景说明 我不想checkout到覆盖本地工作区的文件&#xff0c; 而是想把该版本checkout到另外一个文件夹下&#xff…...

Java多态详解(2)

向上转型和向下转型 向上转型 定义&#xff1a;实际就是创建一个子类对象&#xff0c;将其当作父类对象来使用。 语法格式&#xff1a;父类类型 对象名 new 子类类型() Animal animal new Cat("元宝"&#xff0c; 2); animal是父类类型&#xff0c;但是可以引用子…...

Camtasia导入srt字幕乱码

我们在使用camtasia制作视频项目时&#xff0c;有时为了用户体验需要导入srt格式的字幕文件&#xff0c;在操作无误的情况下&#xff0c;一顿操作猛如虎之后字幕顺利的导入到软件中了&#xff0c;但字幕却出现了乱码的现象。如下图所示&#xff1a; 如何解决srt乱码问题呢&…...

YOLOv5、YOLOv8改进:SOCA注意力机制

目录 简介 2.YOLOv5使用SOCA注意力机制 2.1增加以下SOCA.yaml文件 2.2common.py配置 2.3yolo.py配置 简介 注意力机制&#xff08;Attention Mechanism&#xff09;源于对人类视觉的研究。在认知科学中&#xff0c;由于信息处理的瓶颈&#xff0c;人类会选择性地关注所有…...

ps怎么做网站页面/百度官网网站

阅读本文大概需要 2.8 分钟。来自&#xff1a;https://blog.csdn.net/xiaojimanman/article/details/18556703前几天&#xff0c;在其他网站上看到一个表情自动生成器&#xff0c;自己就试着做了一下&#xff0c;没想到还真给搞定了&#xff5e;目前&#xff0c;可以处理“臣妾…...

java 做直播网站有哪些软件有哪些/重庆森林讲的什么内容

Release 与 Debug 的区别就不多说了&#xff0c; 简单来说 Release 优化过&#xff0c; 性能高一些。 Debug 为方便调试。 默认情况下是 Debug, 那如何改成 Release 呢&#xff1f; 项目上右键&#xff0c;“属性”&#xff0c; 余下的如下图操作&#xff1a;...

怎样黑网站/东莞百度推广排名

1、修改对应网卡的IP地址的配置文件# vi /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICEeth0 #描述网卡对应的设备别名&#xff0c;例如ifcfg-eth0的文件中它为eth0BOOTPROTOstatic #设置网卡获得ip地址的方式&#xff0c;可能的选项为static&#xff0c;dhcp或bootp&#…...

怎样切图做网站/建网站的流程

之前有一位朋友咨询我&#xff0c;Impala中怎样实现将多列转为一行&#xff0c;事实上Impala中自带函数能够实现&#xff0c;不用自己定义函数。以下我開始演示&#xff1a; -bash-4.1$ impala-shell Starting Impala Shell without Kerberos authenticationConnected to cdha…...

网站推广经验杂谈/广州今日头条新闻最新

CSDN话题挑战赛第1期 活动详情地址&#xff1a;话题团队PK赛5/9-5/22-CSDNhttps://marketing.csdn.net/p/bb5081d88a77db8d6ef45bb7b6ef3d7f 参赛话题&#xff1a;Java学习记录 话题描述&#xff1a;每个人学习的路线不同&#xff0c;学习的方式视频教学和跟的老师不同&#xf…...

设计网站推荐国内/网站目录提交

通信技术计算机网络论文1.计算机网络通信技术现状与问题1.1我国计算机网络通信技术的发展现状随着人们对于通信的越来越大的需求&#xff0c;推进我国计算机网络通信技术的创新发展已经显得刻不容缓。在这方面首先做出尝试的正是光通信技术&#xff0c;作为新时期的先进通信技术…...