c++primer:變量和基本類型詳解
前言
我只寫我覺得重要的,同時把一些我覺得比較重要的習(xí)題做一下
類型轉(zhuǎn)換
類型所能代表的范圍決定了轉(zhuǎn)換的過程
比如:當(dāng)我們把一個非布爾類型的算數(shù)值賦給布爾類型時,初始值為0則代表結(jié)果為false,否則結(jié)果為true
當(dāng)把浮點數(shù)賦給整數(shù)時,會舍去小數(shù)部分。
當(dāng)賦給無符號整數(shù)的值大于它表示的范圍時,結(jié)果是這個值對(無符號整數(shù)最大值+1)取模。
變量聲明與定義的關(guān)系
變量聲明規(guī)定了變量的類型和名字,在這一點上定義與之相同,但是除此之外,定義還申請存儲空間,也可能為變量賦一個初始值。如果要聲明一個變量而非定義它,則使用extern關(guān)鍵詞,但是如果給extern修飾的變量初始化了,就抵消了extern的作用
變量命名規(guī)范
- 標(biāo)識符體現(xiàn)具體含義
- 變量名一般用小寫字母
- 用戶自定義的類名一般用大寫字母開頭,如Sales_item
- 如果標(biāo)識符由多個單詞組成,則單詞之間應(yīng)該有明顯區(qū)別,如student_loan或者studentLoan
復(fù)合類型
符合類型是基于基于其他類型定義的類型。
引用
引用為對象起了另一個名字,引用類型引用另一種類型通過將聲明符寫成&d的形式來定義引用類型,其中d是聲明的變量名
引用不是對象,而是一個已經(jīng)存在的對象的另一個別名
由于引用不是對象,所以不存在引用的引用
指針
指針本身就是個對象,允許對指針賦值和拷貝,指針無需在定義時賦初值,和其他內(nèi)置類型一樣,在塊作用域內(nèi)定義的指針如果沒有被初始化,也將有一個不確定的值。
指針的值(即地址)應(yīng)該屬于下列4種狀態(tài)之一
- 指向一個對象
- 指向緊鄰對象所占空間的下一個位置
- 空指針
- 無效指針(上述指針的其他情況)
*關(guān)于指向緊鄰對象所占空間所占對象的下一個位置,說實話沒太看懂,首先我在知乎查找了一下,然后又查看了一下英文版的c++ primer,發(fā)現(xiàn)其意思就是對象末尾的與其相鄰的下一個位置,比如:
int t=5;int p=&t,則p+1就代表這個緊鄰對象所占空間的下一個位置,但是這個對象沒有定義,所以原則上是不能解引用的
const限定符
默認情況下,const 對象僅在文件內(nèi)有效
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)代表值不會改變并且在編譯過程中就能得到計算結(jié)果的表達式。
例子:
const int max_files=20 //
是常量表達式
const limit =max_files+1//limit
是常量表達式
int ret=20//
不是常量表達式,因為其值會改變
const int sa=get_size()//
不是常量表達式,因為其值需要到運行期間得到
常量表達式是由它的數(shù)據(jù)類型和初始值來決定的
c++11新規(guī)定允許將變量聲明為constexpr類型以便由編譯器來驗證變量是否為常量表達式,聲明為constexpr的變量一定是一個常量,而且必須由常量表達式初始化 例:constexpr int sa=20
在constexpr限定符種如果定義了一個指針,限定符constexpr僅對指針有效,對指針指向的對象無關(guān)
auto類型說明符
其作用是讓編譯器去分析表達式的類型,例:auto a=a1+a2,編譯器會自動將a的類型轉(zhuǎn)換成a1+a2結(jié)果的類型。
decltype
其作用是得出表達式的類型 例:decltype(f()) sum=y,sum的類型就是f()返回值的類型
如果表達式的類型是解引用操作,則decltype將得到引用類型,因為解引用操作能給得到指針?biāo)赶虻膶ο?,并且能改變對象的值,所以是引?br />
如果decltype使用一個不加括號的變量則得到的結(jié)果是該變量的類型,如果使用一個加括號的變量,則得到的結(jié)果是引用類型,因為加了括號就代表這個變量是一個表達式,而變量是作為左值的特殊表達式,所以是引用
頭文件保護符
#ifdef 當(dāng)且僅當(dāng)變量已定義時為真,#ifndef當(dāng)且僅當(dāng)變量未定義時為真,一旦檢查得到為真則一直運行直到遇到#endif為止
習(xí)題
練習(xí)讀程序?qū)懡Y(jié)果
unsigned int u=10,u2=42;
std::cout<<u2-u<<std::endl;//32
std::cout<<u-u2<<std::endl;//4294967264,
其結(jié)果邏輯上是-32但是超出了其范圍0-4294967295需要對4294967296取模得到4294967264
練習(xí)
下列那些初始化是正確的
- 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;//正確
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
c語言循環(huán)加數(shù)組實現(xiàn)漢諾塔問題
本文主要介紹了c語言循環(huán)加數(shù)組實現(xiàn)漢諾塔問題,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-01-01C++實現(xiàn)LeetCode(140.拆分詞句之二)
這篇文章主要介紹了C++實現(xiàn)LeetCode(140.拆分詞句之二),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-07-07