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

 

 


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com