c++primer:變量和基本類型詳解
前言
我隻寫我覺得重要的,同時把一些我覺得比較重要的習題做一下
類型轉換
類型所能代表的范圍決定瞭轉換的過程
比如:當我們把一個非佈爾類型的算數值賦給佈爾類型時,初始值為0則代表結果為false,否則結果為true
當把浮點數賦給整數時,會舍去小數部分。
當賦給無符號整數的值大於它表示的范圍時,結果是這個值對(無符號整數最大值+1)取模。
變量聲明與定義的關系
變量聲明規定瞭變量的類型和名字,在這一點上定義與之相同,但是除此之外,定義還申請存儲空間,也可能為變量賦一個初始值。如果要聲明一個變量而非定義它,則使用extern關鍵詞,但是如果給extern修飾的變量初始化瞭,就抵消瞭extern的作用
變量命名規范
- 標識符體現具體含義
- 變量名一般用小寫字母
- 用戶自定義的類名一般用大寫字母開頭,如Sales_item
- 如果標識符由多個單詞組成,則單詞之間應該有明顯區別,如student_loan或者studentLoan
復合類型
符合類型是基於基於其他類型定義的類型。
引用
引用為對象起瞭另一個名字,引用類型引用另一種類型通過將聲明符寫成&d的形式來定義引用類型,其中d是聲明的變量名
引用不是對象,而是一個已經存在的對象的另一個別名
由於引用不是對象,所以不存在引用的引用
指針
指針本身就是個對象,允許對指針賦值和拷貝,指針無需在定義時賦初值,和其他內置類型一樣,在塊作用域內定義的指針如果沒有被初始化,也將有一個不確定的值。
指針的值(即地址)應該屬於下列4種狀態之一
- 指向一個對象
- 指向緊鄰對象所占空間的下一個位置
- 空指針
- 無效指針(上述指針的其他情況)
*關於指向緊鄰對象所占空間所占對象的下一個位置,說實話沒太看懂,首先我在知乎查找瞭一下,然後又查看瞭一下英文版的c++ primer,發現其意思就是對象末尾的與其相鄰的下一個位置,比如:
int t=5;int p=&t,則p+1就代表這個緊鄰對象所占空間的下一個位置,但是這個對象沒有定義,所以原則上是不能解引用的
const限定符
默認情況下,const 對象僅在文件內有效
const的引用
可以把引用綁定到const對象上去,就像綁定到其他對象上去一樣,稱之為對常量的引用,對常量的引用不能用來用作修改其綁定的對象,比如:
有const int a=3,const int &b=a則&b=34,int &c=b這種行為是不允許的,因為&b=34會改變對象的值,而此時是常量,而int &c=b若可以的話則能通過&c=34來改變對象的值,這顯然是不能允許的。
引用所引用的類型與其所引用對象的類型一致
指針和const
由於指針本身就是個對象,因此指針本身是不是常量以及指針指向的對象是不是常量就是兩個獨立的問題。用頂層const(top-level const)代表指針本身是個常量,而用名詞底層const(low-level const)代表指針指向的對象是個常量
constexpr和常量表達式
常量表達式(const expression)代表值不會改變並且在編譯過程中就能得到計算結果的表達式。
例子:
const int max_files=20 //是常量表達式
const limit =max_files+1//limit是常量表達式
int ret=20//不是常量表達式,因為其值會改變
const int sa=get_size()//不是常量表達式,因為其值需要到運行期間得到
常量表達式是由它的數據類型和初始值來決定的
c++11新規定允許將變量聲明為constexpr類型以便由編譯器來驗證變量是否為常量表達式,聲明為constexpr的變量一定是一個常量,而且必須由常量表達式初始化 例:constexpr int sa=20
在constexpr限定符種如果定義瞭一個指針,限定符constexpr僅對指針有效,對指針指向的對象無關
auto類型說明符
其作用是讓編譯器去分析表達式的類型,例:auto a=a1+a2,編譯器會自動將a的類型轉換成a1+a2結果的類型。
decltype
其作用是得出表達式的類型 例:decltype(f()) sum=y,sum的類型就是f()返回值的類型
如果表達式的類型是解引用操作,則decltype將得到引用類型,因為解引用操作能給得到指針所指向的對象,並且能改變對象的值,所以是引用
如果decltype使用一個不加括號的變量則得到的結果是該變量的類型,如果使用一個加括號的變量,則得到的結果是引用類型,因為加瞭括號就代表這個變量是一個表達式,而變量是作為左值的特殊表達式,所以是引用
頭文件保護符
#ifdef 當且僅當變量已定義時為真,#ifndef當且僅當變量未定義時為真,一旦檢查得到為真則一直運行直到遇到#endif為止
習題
練習讀程序寫結果
unsigned int u=10,u2=42;
std::cout<<u2-u<<std::endl;//32
std::cout<<u-u2<<std::endl;//4294967264,其結果邏輯上是-32但是超出瞭其范圍0-4294967295需要對4294967296取模得到4294967264
練習
下列那些初始化是正確的
- int i=-1,&r=0;//錯誤,0為字面值常量,需要常量引用
- int *const p2=&i2;//正確
- const int i=-1,&r=0;//正確
- const int *const p3=&i2;//正確
- const int *p1=&i2;//正確
- const int &const r2;//錯誤,因為引用不是對象,不能用const修飾
- const int i2=i,&r=i;//正確
總結
本片文章就到這裡瞭,希望能夠給你帶來幫助,也希望您能夠多多關註WalkonNet的更多內容!
推薦閱讀:
- C++變量和基本類型詳解
- C++教程之array數組使用示例詳解
- C++ decltype 說明符
- uniapp使用條件編譯#ifdef(跨平臺設備兼容)
- 淺談C++中const與constexpr的區別