目录
C++ 基础
变量
常量
字面量
符号常量-具有名称的常量
数据类型
基本类型
关系与逻辑
关系表达式
运算符优先级
变量计算机的内存
变量指的是会随着程序运算而改变的量。
Tips: 比如用户在售卖机购买的可乐数量和爆米花数量都是不确定的,最后的总价也会各异,所以这些数量和总价都以变量的形式存在于计算机中。
维护这些变量会用到计算机的存储功能。
-
计算机的存储功能会使用内存实现。
-
计算机中的 *** 作系统一般会把内存划分成不同区域来存储数据,以便于管理。
-
内存中每个基本存储单元可以存放一个字节的数据,每个字节具有8位,也就是8个比特(bit)。
-
每个内存单元有一个唯一的地址,常用一个16进制数表示和区分。
变量的声明
-
变量的声明就是向内存申请变量,用于存放数据的过程,一般的声明方式为
数据类型 变量名称
。
// 声明可乐数量变量 coke int coke; // 声明爆米花数量变量 popcorn int popcorn; // 声明消费总额变量 money int money;
变量的命名规则
变量名称也叫做标识符,有固定的构造规则:
-
只能由字⺟、数字和下划线组成;
-
数字不可以出现在第一个位置上;
-
C++的关键字(保留字)不可以⽤做标识符;
-
最好简单易懂,用具有对应含义的英文或者拼音来表示;
标识符是用于表示以下内容之一的字符序列:
-
对象或变量名称
-
类、结构或联合名称
-
枚举类型名称
-
类、结构、联合或枚举的成员
-
函数或类成员函数
-
typedef 名称
-
标签名称
-
宏名称
-
宏参数
关键字
alignas alignof and and_eq asm auto bitand bitor bool break case catch char char8_t char16_t char32_t class compl concept
const const_cast consteval
constexpr
constinit
continue co_await
co_return
co_yield
decltype default delete do double dynamic_cast else enum explicit export
extern false float for friend goto if inline
int long mutable namespace new noexcept not not_eq nullptr operator or or_eq private protected public register reinterpret_cast requires
return short signed sizeof static static_assert
static_cast struct switch template this thread_local throw true try typedef typeid typename union unsigned using virtual void volatile wchar_t while xor xor_eq
变量的初始化
-
在声明变量时,也可以赋予这个变量一个初值,这被称为变量的初始化。
// 声明消费总额变量 money,并且初始化数值为 0 int money = 0;
变量的输出
-
使用C++代码来在屏幕上展示初始化过的的消费总额,这叫做变量的输出,输出的内容是变量中保存的数值,而不是变量名称。
//将初始化好的消费总额打印在屏幕上,并且进行换行 cout << money << endl;
// 导入系统输入输出头文件 iostream
#include
// 使用标准命名空间 std
using namespace std;
int main() {
// 声明可乐数量变量 coke
int coke;
// 声明爆米花数量变量 popcorn
int popcorn;
// 声明消费总额变量 money,并且初始化数值为 0
int money = 0;
// 将初始化好的消费总额打印在屏幕上,并且进行换行
cout << money << endl;
return 0;
}
常量
字面量
数学计算关联最紧密的两类字面量——整数字面量和浮点字面量。
-
整数字面量
是没有任何小数或指数部分的数字字面量,与数学中的整数直接关联。
-
十进制:直接写出的整数。
例如:
0
,23
,-1024
-
八进制:以数字
0
开头的整数,有效数字为0~7
,并且不带有正负号。例如:
0126
,0163
-
十六进制:以
0x
或0X
开头的整数,有效数字为0~9
、A~F
(a~f
),并且不带有正负号。例如:
0x12a
,0xf39
-
-
浮点字面量
是有分数形式或指数形式的数字字面量,与数学中的小数直接关联。
-
小数形式:由数字和小数点组成
例如:
0.66
,30.0
,14.15926
-
指数形式:在数学中,一个可以用幂的形式来表示的形式。
在C语言中,则以
e
或E
后跟一个整数来表示以10
为底数的幂数。-
e
或E
的左侧必须要有数字 -
e
或E
的右侧为幂次的数值,必须为整数 -
上述小数可以等价表示为:
6.6E-1
,30.0e0
,0.01415926E3
-
-
-
字符字面量-表达字符的常量
不同于直接参与计算的整数与浮点字面量,常量中还有一类主要用来表达常见字符的常量,分为单字符字面量与转义符字面量。
-
单字符字面量:
通过将单个字符括在单引号内来创建字符字面量。
例如:
'a'
,'m'
,'F'
,'2'
,'}'
等。 -
转义符字面量:
使用''开头的转义字符序列来表示一个特殊字符。
转义字符
Tips:有时,在C++编程中必须使用不能键入或具有特殊含义的字符。
例如,换行符(回车),制表符,问号,引号等。
为了使用这些字符,就会使用''开头的转义字符序列用来表示一个特殊字符。
例如:
`'\n'`表示换行符; `'\t'`表示制表符; `'\''`表示单引号字符(不被解析成字符外的单引号); `'\\'`表示真正的斜杠字符。
ASCII编码
所有的字符字面量在计算机里都是有一个编码的,为了避免大家用不同的编码,造成混乱,美国的组织就出台了ASCII编码(American Standard Code for Information Interchange:美国信息交换标准代码),所有字符都采用ASCII编码,共有128个字符。
每个字符都对应着一个
0~127
之间的整数。下面两个表格中,深灰色的列就是其右侧字符对应的ASCII编码,你可以大致浏览一下,不需要强行记忆。
字符串字面量-构成输出的常量
回顾我们在学习C++时会编写的第一个程序,就是用来输出
Hello, World!
这句话。#include
using namespace std; int main() { cout << "Hello, World!" << endl; return 0; } 可以看到
Hello, World!
被一对双引号""
包围,这一个整体就是一个字符串字面量。-
字符串字面量是由一对双引号括起来的字符序列
-
字符串中可以包含类似于字符字面量普通字符以及转义字符
-
字符串除了存储所包含的字符外,还额外包含一个结束标志
'
'
'ASCII编码
'0
:结束符;**** **** ****
对应数值为const
的字符
练习
请使用转义字符打印一个3行4列的星号长方形:
const int kCokePrice = 5; const int kPopcornPrice = 10;
参考代码:
符号常量-具有名称的常量#include
using namespace std; int main() { // 每行都输出4个*和一个换行符 cout << "****\n" ; cout << "****\n" ; cout << "****\n" ; return 0; } -
在C++中,随着程序运算不改变的量叫做符号常量,可以使用
const
关键字来定义并且初始化:
int
-
int
是⼀个修饰符,加在数据类型int const kCokePrice = 5;
的前⾯,用来给这个变量加上一个不变的属性-
初始化时也可以将修饰符const与数据类型
const 数据类型 常量名称 = 初始值;
调换位置,写成数据类型 const 常量名称 = 初始值;
-
-
符号常量命名时参照Google 开源项目风格指南,以 “k” 开头,大小写混合
-
实际编程过程中的名字最好简单易懂,用具有对应含义的英文或者拼音来表示
-
-
定义的时候必须进行初始化,且在初始化之后不能再进行修改与重新赋值
-
如果试图对常量做修改,例如把它放在赋值符号的左边,就会被编译器发现并指出错误
-
最后,总结一下符号常量的初始化伪代码:
数据类型 变量名称;
或者
short
-
在C++的变量声明中,变量名之前需要指定数据类型。
int
数据类型将会决定一个变量存储什么样的信息,从而决定变量的容量**有多大,在内存中需要分配多大的空间。
整数类型
数值整数类型
-
数值整数用来表示没有小数部分的数字。
-
数值整数可以按照占用内存大小分类
-
long
、long long
、short
以及int
,占用内存越大的类型能表示的数值范围就更大。 -
long
、long long
、short
以及int
这四种数值整数类型占用的字节数递增,所以能表示的整数范围也递增。-
short
类型至少占据2个字节,即16位;一般占用2字节; -
long
在现代系统中一般占用4个字节,即32位;类型长度大于等于int
类型; -
long long
类型长度至少占据4个字节,且大于等于long
类型;一般占用4个字节; -
unsigned int
类型长度至少占据8个字节,且大于等于int
类型;一般占用8个字节。超过范围将无法正常表示
-
-
-
同时又可以按照是否表示负值
-
分为有符号版本和无符号版本
比如:
-
signed int
就表示无符号的int
类型,只能表示正值; -
short
就表示有符号的unsigned
类型,可以表示负值。 -
在不指定有无符号时,都默认是有符号版本。
-
-
表示
-
如果是无符号版本,那么一个8位的内存块可以一一对应到0~255之间的整数;
-
如果是有符号版本,那么就会考虑负数,这个8位的内存块可以表示一128~127之间的整数。
-
默认状态下
char
等四个整数类型都是符号类型,这使得它们能够表示的最大数值减小了一半左右。 -
在确定变量的数值不会是负数的情况下,我们可以利用
char
关键字,加在原有数据类型之前,创建无符号的整数类型。
-
-
-
字符类型
-
字符类型则专门用来存储计算机中的基本符号:英文字母、数字以及标点等。
计算机通过ASCII编码,将128个字符映射到对应数字上,于是我们使用一个字节(8位)就可以将所有的字符表示出来。
通过查看内存,可以发现储存在类型为
// 用字符常量初始化一个 char 类型 char size_1 = 'L'; // 用整数常量初始化一个 char 类型,字符L的ASCII编码值为76 char size_2 = 76;的变量中的实际上是一个整数,对应于这个字符的ASCII编码值。
所以,我们可以既可以使用字符常量,也可以使用字符对应的ASCII编码,来给long long
类型的变量赋值。
float
字符整数类型虽然存储方式和数值整数类型相似,都是存放一个数值,但是在输出显示时是不同的。
我们可以通过以下代码来观察数值整数类型和字符整数类型的区别:
// 初始化一个 int 类型 int length = 76; // 用字符常量初始化一个 char 类型 char size_1 = 'L'; // 用整数常量初始化一个 char 类型,字符L的ASCII编码值为76 char size_2 = 76; cout << "衣服的长度为:" << length << "厘米。
\n"; cout << "衣服的大小为:" << size_1 << "号。
\n"; cout << "衣服的大小为:" << size_2 << "号。
\n"; //cout识别到了size_1和size_2是字符类型变量,从而在输出时自动进行了转换,把数字转成了该编码对应的字符。
可以看到,程序的输出为:
衣服的长度为:76厘米。
衣服的大小为:L号。
衣服的大小为:L号。
浮点类型
表示精度
学习了C++中的各种整数类型,我们继续来看基本类型中的第二大块:浮点类型。
-
计算机用浮点数表示两类数:
-
带小数部分的数字; 例如:圆周率3.14、黄金分割比例0.618等,这些数字在整数之间
-
数值非常大的数字。
例如:宇宙中原子个数约10的80次方,这个数字已经无法被
double
整型表示
-
-
C++中的浮点数分为三种类型:
long double
、float
以及double
,分别表示不同的精度。 -
浮点数的精度在于它可以表示的有效位数以及指数范围。
-
指数范围指的是可以表示的指数幂次大小;
-
由于浮点数更多的应用是用来表示带小数的数字,所以我们主要从有效位数的角度讲解精度。
-
有效位数用来描述浮点数值的刻画精确程度。
例如:3.14的有效位数是3位,3.1415926的有效位数是8位。
Tips: 需要注意的是,有效位数不会因为小数点的改变而改变,无论314000或者3.14000,它们的有效位数都是3位,多出来0可以看作是一种占位符,因为实际有意义的数字只有3个:3、1和4。
-
在三种浮点类型中,更大的内存空间可以表示更多的有效位数:
-
float
类型通常占用4个字节,有效位数为6位 -
long double
类型占用的空间是<
类型的两倍,即8个字节,有效位数为15位 -
<=
类型一般占用16个字节的空间
-
-
在C++中,关系运算符用于判断表达式之间的大小关系,对两边的值进行6种情况的判断:
-
大于
>
和大于等于>=
运算符 -
小于
==
和小于等于!=
运算符 -
相等
==
和不相等=
运算符
-
-
关系运算符中,表达式结果的类型可以是字符或者数字,但不可以是字符串
-
关系表达式返回一个布尔值:成立为1(true)代表真,不成立为0(false)代表假
Tips:判断两个数是否相等,用的是=
而非==
,因为!=
是用于赋值 *** 作的。
-
浮点数
一般不会用
a
或者b
来判断,因为可能产生表示误差比较两个浮点数是否相等,需要看两个数的差值是否小于一定的精度,比如:
-
对于浮点数
(a - b) < 1e-6
和+
,如果-
如果值为真,就判断两个浮点数相等。
-
-
至此,我们已经学习的运算符如下:
-
算术运算符(
*
/
%
++
--
=
<<
等) -
赋值运算符(
<
等) -
位运算符(
<=
>>
等) -
关系运算符(
>
>=
==
!=
&&
||
等) -
逻辑运算符(
!
等)
-
-
对于这些常用的运算符,按照计算优先级从高到低(左边更高,右边更低)进行排列,可以得到如下表格:
Tips:对于一个表达式,虽然可以通过计算优先级省略掉括号,但为了代码的可读性,我们在编写时一般都选择把括号加上。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)