1. 常量
1.1 概述
在开发中不会发生改变的量,称之为常量。
生活很多内容都是常量,例如: 重力加速度,光速,圆周率,温度25摄氏度,一个标准大大气压下的水密度。
1.2 开发中使用的常量
C/C++ 中针对于常量进行了数据类型划分
整数类型
1, 2, 3, -1, -2, -3
浮点数类型
0.618, 11.11, 3.1415
字符类型
数据要求,字符常量要求使用英文单引号包含的单个内容
C/C++ 字符类型有且只占用一个字节内存,中文通常情况下占用的内存字节数是 2 ~ 3 个字节,C/C++ 字符类型无法描述/使用中文。在嵌入式开发中,中文的支持效果一般。
'A' '1' ',' ':' ' ' 'abcd' 不允许出现多个字符字符串类型
数据要求,字符串常量使用英文双引号包含所有数据内容
虽然字符串内容支持中文,但是在开发中尽量少用中文形式。
"课间去搞一杯瑞幸瑰夏" "瑰夏,花魁" "Please~~~"C++ 特有常量类型 bool/布尔 类型
bool 类型有且只有在 C++ 中支持,对应常量
true false
1.3 常量案例代码
了解一下 C 语言 printf 函数所需的常用数据占位符。
%d # 整数 %c # 字符 %s # 字符串 %f # 浮点
#include <stdio.h> int main(int argc, const char * argv[]) { // 整数常量 // %d 是整数数据在 printf 打印操作对应的数据占位符 printf("integer value :%d\n", 10); printf("integer value :%d\n", 100); printf("integer value :%d, %d\n", 300, 2000); // 浮点常量 printf("float value : %f\n", 3.5); printf("float value : %f\n", 5.5); // 字符常量 printf("char value : %c\n", 'A'); printf("char value : %c\n", '1'); printf("char value : %c\n", '中'); // 字符串常量 printf("string value : %s\n", "中文支持,但是不常用"); printf("string value : %s\n", "Input parameter is invalid!\n"); return 0; }
1.4 字符常量【重点】
1.4.1 编码集
开发中字符数据都是一张图片,计算机将每一个文字对应的图片进行编号,同一个编号就是一个编码集。开发中常用的编码集
ASCII : American Standard Code for Information Interchange 在任何一个电子设备上都支持。并且要求目前流行于开发中所有编码集,必须支持 ASCII。在编码集的前 128 位 或者前 256 位必须支持 ASCII 码。主要包括英文字母,数字字符,标点符号,和不可见字符。
GBK:新国标,支持中文简体和少数民族文字
GB_2312:之前的国标,仅支持中文简体和部分少数民族文字
BIG5: 中文繁体字编码
1.4.2 ASCII 码表
重点
开发中使用字符请使用字符本身,不允许使用字符对应的编码值,增强代码的阅读性,严格遵守数据类型一致化要求。
在 ASCII 中编码值 0 ~ 31 前 32 个字符为不可见字符。
数字字符顺序是 '0' ~ '9'
英文字母中,大写字母编码值小于小写字母
英文字母在 ASCII 表中,英文字母大写到英文字母小写之间有其他字符
十进制 ASCII
八进制 ASCII
1.4.3 转义字符
要求:使用
\
开头,可以将部分特定含义字符,转换为无特殊含义,仅作为字符本身使用,或者将特定的无意义字符转换为特殊功能字符。
常用的特殊含义转无意义
\" // 【常用】双引号是 C/C++ 中的字符串常量标记。将双引号作为字符串内容的一部分,不再作为字符串开始和结尾标记 \' // 【少见】同理双引号,主要用于字符数据 \\ // 【少见】转义转义字符
常用无意义转特殊含义
\n // 【常用】回车 \r // 【后期常用】换行,后续课程发送到网络端字符串数据需要提供以 "\r\n" 结尾 \t // tab 制表符 \a // 可以用于蜂鸣器工作,基本上无法使用
1.4.4 来自 2015 年的面试题
请问 \40 是什么?
结果是一个 空格 space 字符,对应 ASCII 十进制编码为 32,八进制编码为 040 1. \ 之后的数值默认为八进制,且八进制 0 开头标记可以省略。 2. 对应的是 ASCII 八进制 040 编码字符,也就是 space 空格 建议 1. 开发中字符数据请使用字符本身,不要搞歪门邪道!!! 2. 如果在面试中遇到类似问题,拍照发群里,大家一起看!!!
#include <stdio.h> #include <string.h> #include <stdlib.h> int main(int argc, const char * argv[]) { printf("sizeof : %ld\n", sizeof("Hello\076abc")); // sizeof : 10 printf("strlen : %ld\n", strlen("Hello\076abc")); // strlen : 9 return 0; }
2. 变量【小重点】
2.1 概述
变量是开发中最常用的数据形式,也是在后续代码执行过程中,检测代码情况,代码形式,代码运行状态。都是通过变量数据是否满足执行预期判断。
生活角度分析变量形式,例如 温度,湿度,速度,年龄,时间,发量,体重。变量存在核心要求
数据类型,数据形式
名称,约定俗成,见名知意
容器概念和数据变化
2.2 C/C++ 定义变量的格式
格式要求
数据类型 变量名 = 初始化数据;
数据类型:限制当前变量存储的数据类型,数据形式,按照开发要求有且只允许存储对应数据类型,严格遵守数据类型一致化要求。基本数据类型可以参考【常量类型】
变量名: 操作当前变量对应的名称,要求见名知意,约定俗成,并且变量名在一定范围内唯一。
= :赋值号,将赋值号右侧的数据,赋值给左侧的变量
初始化数据 : 要求满足当前数据类型所需,提供必要的初始化数据,并且在开发中,变量一行仅定义一个,同时直接进行初始化操作。
2.3 C 语言基本数据类型【重点】
在 C 语言中基本数据类型
整型 : short int long
浮点型: float double
字符型: char
2.3.1 整型数据类型
整型数据类型主要用于存储开发中使用的整数数据,通常情况下默认整数为 int 类型
int 类型要求是在 32 位机及其以上占用 4 个字节,如果是 16 位机占用 2 个字节
long 类型要求是在 64 位机占用 8 个字节,如果是 32 位机占用 4 个字节
要求,后续描述 int 和 long 类型专用的内存空间字节数,请明确分析对应的系统/计算机情况。
数据类型 | 占用内存字节数 | 数据存储范围 |
---|---|---|
short | 2 字节(16bit) | -0 ~ 65535 |
int | 4 字节(32bit) | 0 ~ 2^32 - 1 |
long | 8 字节(64bit) | 0 ~ 2^64 - 1 |
2.3.2 浮点数据类型
浮点类型用于存储小数/浮点数
计算机系统默认浮点数对应的数据类型为 double 类型,为了更好的数据存储精度和对应的数据完整性。
在后续的 STM32 学习中,必须知晓 M3(F1) 架构和 M4(F4) 架构区别,M4 架构相较于 M3 多出两个模块 DSP(数字信号处理), FPU(浮点类型数据处理器),硬件角度 M4 比 M3 性能更好,同时硬件支持浮点类型数据。在 M3 中浮点类型数据支持是依赖于 STM32 标准库完成。
浮点类型数据在使用时,需要明确的注意数据完整性和稳定性问题,通常情况下如果对数据的精度要较高要求,不会单一使用浮点类型数据解决问题,可以采用字符串常量数据保证数据的完整性和稳定性。
数据类型 | 占用内存字节数 | 数据存储范围 |
---|---|---|
float | 4 字节(32bit) | 10^38 |
double | 8 字节(64bit) | 10^308 |
2.3.3 字符数据类型
在开发中存储字符数据,或者存储一个字节的数据。后续开发中会使用到以下类型
u_int8, u_int16, u_int32, u_int64
同时字符类型数据在使用时,请使用字符本身,不允许使用编码值。
数据类型 | 占用内存字节数 | 数据存储范围 |
---|---|---|
char | 1 字节(8bit) | ASCII 码 |
2.4 变量名称要求
代码中的变量名需要按照标准要求完成,变量名在开发中也认为是【标识符】,开发中标识符是存在一定的规范。
标识符可以使用的字符范围英文字母(A ~ Z a ~ z),数字字符(0 ~ 9),唯一可以使用的标点符号下划线 (_)
标识符要求必须英文字母开头
标识符没有严格的长度限制,一般会遵循阅读性至上原则
标识符要求见名知意,动宾结构,约定俗成。
标识符需要满足一定的命名规则
下划线命名规则
要求不同的英文单词之间使用 _ 下划线分割
get_message send_msg read_file_data save_data_to_file驼峰命名规则
小驼峰 第一个英文单词首字母小写,之后的每一个单词首字母大写
getMessage sendMsg readFileData saveDataToFile
大驼峰 每一个单词首字母大写
QPushButton QLabel QRadio QString QList QVector标识符不可以使用 C/C++ 占用的关键字和保留字。
标识符在一定范围内唯一
2.5 变量定义案例
#include <stdio.h> /* main 函数执行命令行参数内容 argc argument count 参数个数 argv argument value 参数值 */ int main(int argc, const char * argv[]) { // 整数变量 short num1 = 10; int num2 = 20; long num3 = 1000; printf("num1 : %d\n", num1); printf("num2 : %d\n", num2); printf("num3 : %ld\n", num3); printf("sizeof(short) : %ld\n", sizeof(short)); printf("sizeof(int) : %ld\n", sizeof(int)); printf("sizeof(long) : %ld\n", sizeof(long)); printf("------------------------------------------\n"); // 浮点变量 float num5 = 5.5; double num6 = 6.6; printf("num5 : %f\n", num5); printf("num6 : %lf\n", num6); printf("sizeof(float) : %ld\n", sizeof(float)); printf("sizeof(double) : %ld\n", sizeof(double)); printf("------------------------------------------\n"); // 字符变量 char ch1 = 'A'; char ch2 = 'B'; char ch3 = '1'; printf("ch1 : %c\n", ch1); printf("ch2 : %c\n", ch2); printf("ch3 : %c\n", ch3); printf("sizeof(char) : %ld\n", sizeof(char)); return 0; }
2.6 变量定义常见问题
2.6.1 未定义直接使用
存在两种情况
变量没有定义,直接使用
变量定义,但是后续使用中,拼写错误,导致报错未定义问题。
2.6.2 未初始化直接使用
一个变量如果在没有赋值的情况下进行使用,会导致【野值】问题。
任何一个 C/C++ 中的变量必须先赋值后使用。野值有可能导致代码中出现一些无法复现,无法预估,无法进行明确定位的错误。
后续演示野值情况!!!
2.6.3 变量重复定义
变量名在同一个大括号中唯一,不可以重复定义!!!
2.6.4 数值使用建议
浮点类型数据常量默认为
double
类型,给予float
类型赋值时,严格来说是不满足数据类型一致化要求。建议使用浮点类型数据常量给予float
类型赋值,需要在常量之后使用大写F
明确告知编译器,当前常量为float
类型常量float num = 3.5F; // F 明确限制当前 3.5 为 float 类型。长整数数据赋值,因为整数常量默认都是
int
类型数据,为了考虑数据类型一致化要求,在给予long
类型变量赋值使用的常量,可以加上大写L
,明确告知为long
类型,但是很少用!long num = 10L; // L 是告知当前 10 为 long 类型常量