1 C++语法特征简述
理解语法特征的实现细节是学习并掌握编程语言的第一步
最基本的特征包括:
- 整型、字符串等内置类型
- 变量,用来为对象命名
- 表达式和语句,用于操作上述数据类型的具体值
- if或while等控制结构,这些结构允许我们有选择性地执行一些语句或重复地执行一些语句
- 函数,用于定义可供随时调用的计算单元
大多数语言可自定义数据类型进行扩展,并将有用的功能进行封装为库函数
Python是在程序运行时检测数据类型,而C++是一种静态数据类型语言,在编译过程中就进行检查,编译器直到程序每个变量对应的数据类型
C++提供基本的内置数据类型,而且其显著的语法特征是类
新类型既可以包含数据成员,也可以包含函数成员
C++标准库就有丰富的类和函数
数据类型是程序的基础,C++支持的基本内置类型包括字符、整型、浮点数等,标准库还好办可编程字符串和向量等
C++包含算术类型和空类型(void),算术类型包含字符、整型数、布尔值和浮点数,空类型不对应具体值,常用于函数不返回任何值的时候
2 算术类型
算术类型分为两类,整型(包含字符和布尔类型)和浮点型
- bool,布尔类型,取值位true或false
- char,字符,最小尺寸8位,正好1个机器字节
- wchar_t,宽字符,最小尺寸16位
- char16_t,Unicode字符,最小尺寸16位
- char32_t,Unicode字符,最小尺寸32位
- short,短整型,最小尺寸16位
- int,整型,,最小尺寸16位
- long,长整型,最小尺寸32位
- long long,长整型,最小尺寸64位
- float,单精度浮点数,6位有效数字
- double,双精度浮点数,10位有效数字
- long double,双精度浮点数,10位有效数字
字节byte是可寻址的最小内存块,字word是存储的基本单元,通常由几个字节组成,大多数机器的字节是8bite构成
内存中的每个字节与一个数字(地址/address)对应
除了bool之外的整型都是可以带符号的,而在类型名前添加unsigned可得到无符号类型
字符型可分为char、unsigned char、signed char
知晓数值不能为负,则使用无符号类型
short太小,int和long一般一样大,超过int建议选用long long
算术表达式不使用char和bool
浮点计算一般选用double,float通常精度不够且计算代价与double类似
2.1.1 练习
- 2.1 int,long,long long和short的区别是什么?无符号类型和带符号类型的区别?float和double的区别?
4中整型的区别在于尺寸,所能表示的数字范围不同;无符号类型只能表示非负数;float精度比double低 - 2.2 计算按揭贷款,利率、本金和付款选择的数据类型
由于金额是浮点数,所以可以选择float或double,为了精度保证,优先选择double
3 类型转换
从一种类型到另外一种类型的转换,程序有时会自动转换
bool b = 42; // b为真
int i = b; // i的值为1
i = 3.14; // i为值为3
double pi = i; // pi的值为3.0
unsigned char c = -1; // 若char占8比特,则c的值为255
signed char c2 = 256; // 若char占8比特,则c的值是为定义的
bool赋值0时结果为false,否则结果为true
超出范围可能报错或产生垃圾数据但不会终止程序
无符号类型不能赋值负数,不要混用带符号和无符号类型
练习
- 2.3 读程序写结果
#include <iostream>
int main()
{
unsigned u = 10, u2 = 42;
std::cout << u2 - u << std::endl; // 32
std::cout << u - u2 << std::endl; // 异常值
int i = 10, i2 = 42;
std::cout << i2 - i << std::endl; // 32
std::cout << i - i2 << std::endl; // -32
std::cout << i - u << std::endl; // 0
std::cout << u - i << std::endl; // 0
return 0;
}
- 2.4 略
4 字面值
0x或0X表示十六进制数
浮点型字面值时一个double,指数用e或E标识
单引号标识一个字符时char型字面值
双引号里的0个或多个字符构成字符串型字面值
每个字符串结尾添加一个空字符(’\0’),实际长度+1
如果两个字符串仅有空格、缩进和换行符分隔,则实际是一个整体
true和false时bool字面值
nullptr时指针字面值
5 转义序列
转义序列均以反斜线开始,包括:
- 换行符\n
- 横向制表符\t
- 报警符\a
- 纵向制表符\v
- 退格符\b
- 双引号"
- 反斜线\
- 问号?
- 单引号’
- 回车符\r
- 进纸符\f
转义序列当作一个字符使用
\x后紧跟一个或多个十六进制数字,或者\后紧跟1个、2个或3个八进制数字,都可以标识转义序列
6 制定字面值的类型
可以通过前缀和后缀来制定字面值类型
前缀包含u–char16_t,U–char32_t,L–wchar_t,u8–char
后缀包括u/U–unsigned,l/L–long,ll/LL–long long,f/F–float,l/L–long double