第2章 变量和基本内置类型
2.1 算术类型
bool char character 8 wchar_t wide character 16 char16_t Unicode character 16 char32_t Unicode character 32 short short integer 16 int integer 16 long long integer 32 long long 64 float single-precision floating-point 6 significant digits double double-precision floating-point 10 significant digits long double extended-precision floating-point 10 significant digits
char_t类型保证机器最大扩展字符集中任意字符都可以存储
char16_t和char32_t为unicode字符集服务
比特bit、字节byte、字word
1byte=8bit
word的大小与机器有关,一般为4byte
signed和unsigned
对于char类型来说,其实现在不同的机器上可能是不同的,有些是signed,有些则是unsigned,因此在需要用char进行数学算术运算的时候,应该指明符号。
将一个负数,强制转换为一个无符号的数字的时候,结果为这个负数加上无符号数的模。
例如,将-1转换为unsigned short:unsigned short的模为65536,则unsigned short(-1)的结果为65535
更深刻的理解是,将一个负数转换成无符号数字的时候,直接是将其补码的符号位1,当做正常的无符号数字解读,其内存中的数据没有变化,如下:
cout<<short(0xffff)<<endl; //输出-1 cout<<unsigned short(0xffff)<<endl; //输出65535 cout<<unsigned short(short(0xffff))<<endl; //输出65535
进制表示
15 十进制,015 八进制,0x15十六进制
字符串可以分行书写
cout<<"姓名 学号\n" "王五 0125";
转义序列
\后紧跟1-3个八进制数字
\x后紧跟1-*个十六进制数字
字面值前后缀
前缀
u Unicode 16字符 char16_t
U Unicode 32字符 char32_t
L 宽字符 wchar_t
u8 UTF-8 char[]字符串
后缀
u/U unsigned
l/L long
ll/LL long long
f/F float
l/L long double
类型可以组合,比如42ULL为unsigned long long
2.2 变量
变量初始化
int value1 = 0; int value2 = {0}; int value3(0); int value4{0}; //以上四个效果相同 vector<int> value5{1, 2, 3, 4, 5};//存储了1 2 3 4 5 vector<int> value6(10,-1);//存储了10个-1
内置类型(int、double、char)在定义时如果没有给定初始值,将不被初始化。
访问全局变量
int value=10; int main() { int value=5;//覆盖了全局变量value int newValue=::value;//使用::访问全局变量 }
2.3 复合类型
引用reference
int &rValue=value; 变量或者对象的别称,占用同一块内存,在声明引用的时候必须初始化,初始化后不可改变引用的变量或对象。
指针pointer
int *pValue=&value; 声明一个变量,其存储的是另外一个变量的地址。
空指针:
int *pValue=nullptr;
int *pValue=0;
int *pValue=NULL; //需要include<cstdlib>
void *指针
任何类型都可以用void*指针,可以认为void*指针就是对应一块内存区域。
2.4 const限定符
指针和const
const int value = 32; //value对应的内存不能改变 //指向常量的指针pointer to const const int *cpValue = &temp; //cpValue对应的内存可以改变(可以重新指向另一个变量),但是temp不可以通过cpValue改变(指向的变量不能更改) //常量指针const point int *const pcValue = &temp; //pcValue对应的内存不能更改(不可以重新指向另一个变量),temp可以通过pcValue更改(指向的变量可以更改) //指向常量的常量指针 const int *const cpcValue = &temp;//都不可以更改
补充:const int *const p = &value,其中第二个const是顶层,限制p的内存不能更改;第一个const是底层,限制指向的内存不能改。
constexpr和常量表达式
常量表达式指的是在编译的时候就可以确定的值的常量。
比如下边两个都是常量表达式:
const int max_files = 20; const int limit = max_files + 1;
但是有时候不能确定一个语句是不是常量表达式,这就可以constexpr进行变量声明,由编译器验证是不是常量表达式:
constexpr int limit = mf + 1;//只有当mf是编译时确定值,表达式才能通过编译
2.5 类型的处理方式
类型别名
typedef double wages, *pWages;//wages是double的别名,pWages是double*的别名
using db = double;//C++11中支持的
auto
auto item = v1 + v2;//由编译器推断item的类型
decltype
选择并返回操作数的数据类型
decltype( f() ) sum = x;
当操作数加括号,表示操作数的引用类型
decltype( (f()) ) sum = x;