第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;

 

 

你可能感兴趣的:(变量)