单片机之从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会发送一次向服务器连接的请求,以保持会话始终在线 验证: 放一段时间不操作,…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...
[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序
一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...
多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...
智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...
