溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

C++中變量和基本類(lèi)型的示例分析

發(fā)布時(shí)間:2021-06-12 16:44:10 來(lái)源:億速云 閱讀:164 作者:小新 欄目:編程語(yǔ)言

這篇文章主要介紹C++中變量和基本類(lèi)型的示例分析,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

變量和基本類(lèi)型

一些語(yǔ)言,如Smalltalk和Python等,在程序運(yùn)行時(shí)檢查數(shù)據(jù)類(lèi)型;與之相反,C++是一種靜態(tài)數(shù)據(jù)類(lèi)型語(yǔ)言,它的類(lèi)型檢查發(fā)生在編譯時(shí)。
- 內(nèi)置類(lèi)型(built-in type):由語(yǔ)言定義的類(lèi)型,如int。
- 類(lèi)類(lèi)型(class type):程序員自定義的數(shù)據(jù)類(lèi)型。

++數(shù)據(jù)類(lèi)型告訴我嘛數(shù)據(jù)的意義以及我們能在數(shù)據(jù)上執(zhí)行的操作。++

基本內(nèi)置類(lèi)型

術(shù)語(yǔ)chunk(塊):用于處理存儲(chǔ),使存儲(chǔ)具有結(jié)構(gòu)的最基本方法。塊的位數(shù)一般是2的冪,這樣可以一次處理8、16、32、64或者128位。注意區(qū)分block。

++可尋址的最小內(nèi)存塊稱(chēng)為“字節(jié)(byte)”;存儲(chǔ)的基本單元稱(chēng)為“字(word)”,通常由幾個(gè)字節(jié)組成。++
- 算數(shù)類(lèi)型(arithmetic type):整數(shù)、浮點(diǎn)數(shù)、單個(gè)字符、布爾值
 - 整型(integral type):表示整數(shù)、字符和布爾值的算術(shù)類(lèi)型合稱(chēng)為整型  
- 字符型:char(單個(gè)機(jī)器字節(jié):byte)和wchar_t(寬字符型,用于擴(kuò)展字符集,比如漢字和日語(yǔ))
- short:半個(gè)機(jī)器字長(zhǎng);int:一個(gè)機(jī)器字長(zhǎng);long:兩個(gè)機(jī)器字長(zhǎng)。ps:在32位機(jī)器中int和long的字長(zhǎng)通常是相等的。最小存儲(chǔ)空間分別為16位、16位和32位
- 整型的賦值:賦值時(shí),取該值對(duì)該類(lèi)型取值數(shù)目求模后的值。
 - 浮點(diǎn)型:?jiǎn)尉?、雙精度、擴(kuò)展精度(long double)
- 一般而言,float占1個(gè)字(32比特),double占2個(gè)字(64比特),long double以3或4個(gè)字(96或128比特)來(lái)表示。
- 通常選用double,float的精度損失大(double能至少保證10位有效數(shù)字,float只能保證6位),而double的計(jì)算代價(jià)相對(duì)于float可以忽略。
 - 16位signed最大數(shù)32767,unsigned最大數(shù)65535。
- 空類(lèi)型(void):通常用作無(wú)返回值函數(shù)的返回類(lèi)型

類(lèi)型轉(zhuǎn)換
unsigned char c = -1;     //假設(shè)char占8比特,c的值為255signed char c2 = 256;     //假設(shè)char占8比特,c2的值是未定義的
  • 當(dāng)我們賦給無(wú)符號(hào)類(lèi)型一個(gè)超出它表示范圍的值時(shí),結(jié)果是初始值對(duì)無(wú)符號(hào)類(lèi)型表示數(shù)值總數(shù)取模后的余數(shù)。

  • 當(dāng)我們賦給帶符號(hào)類(lèi)型一個(gè)超出它表示范圍的值時(shí),結(jié)果是未定義的(undefined)。此時(shí),程序可能繼續(xù)工作、可能崩潰,也可能生成垃圾數(shù)據(jù)。

  • 不可混用帶符號(hào)類(lèi)型和無(wú)符號(hào)類(lèi)型。如果表達(dá)式里這兩種類(lèi)型都有,帶符號(hào)數(shù)會(huì)自動(dòng)轉(zhuǎn)換為無(wú)符號(hào)數(shù)。

字面值常量(literal constant)

  • 稱(chēng)之為字面值是因?yàn)橹荒苡盟闹捣Q(chēng)呼他,稱(chēng)之為常量是因?yàn)樗闹挡荒軌蛐薷摹?/p>

  • 只有內(nèi)置類(lèi)型存在字面值,沒(méi)有類(lèi)類(lèi)型的字面值,因此也沒(méi)有標(biāo)準(zhǔn)庫(kù)類(lèi)型的字面值。

  • 使用十進(jìn)制、八進(jìn)制(0開(kāi)頭)或十六進(jìn)制(0x或0X開(kāi)頭)

//20的三種表示:20      /*十進(jìn)制*/024     /*八進(jìn)制*/0x14    /*十六進(jìn)制*/
  1. 整型字面值:字面值常量類(lèi)型默認(rèn)為int或long型。通過(guò)加后綴能夠強(qiáng)制將字面值轉(zhuǎn)化為long、unsinged、unsigned long,后綴為L(zhǎng)、U、UL或LU(小寫(xiě)亦可。不提倡使用l,易與1混淆)。

  2. 浮點(diǎn)字面值:十進(jìn)制或科學(xué)計(jì)數(shù)法來(lái)表示(用e或者E)。默認(rèn)double類(lèi)型,加F或f表示單精度,加L或l表示擴(kuò)展精度。

  3. 布爾字面值:true和false。

  4. 字符字面值

    名稱(chēng)書(shū)寫(xiě)
    換行符\n
    水平制表符\t
    縱向制表符\v
    退格符\b
    回車(chē)符\r
    疑問(wèn)號(hào)\?
    雙引號(hào)\”
    • \ooo:這里的ooo表示三個(gè)八進(jìn)制數(shù)字,這三個(gè)數(shù)字表示字符的數(shù)字值。如’\0’通常表示“空字符(null character)”。

    • 也可以用十六進(jìn)制轉(zhuǎn)義字符來(lái)定義:\xddd。一個(gè)反斜線(xiàn)、一個(gè)x和一個(gè)或多個(gè)十六進(jìn)制數(shù)組成。

    • 通用轉(zhuǎn)義字符:

    • 可打印字符通常用一對(duì)單引號(hào)定義,如‘a(chǎn)’;在前面加L就能得到wchar_t類(lèi)型的寬字符字面值,如L‘a(chǎn)’。

    • 不可打印字符和特殊字符都用轉(zhuǎn)義字符書(shū)寫(xiě),轉(zhuǎn)義字符以反斜線(xiàn)開(kāi)始。

  5. 字符串字面值

    • 雙引號(hào)括起來(lái)的0個(gè)或多個(gè)字符。

    • 為了兼容C語(yǔ)言,C++所有的字符串字面值都由編譯器自動(dòng)在末尾添加一個(gè)空字符(‘\0’),因此,其實(shí)際長(zhǎng)度要比它的內(nèi)容多1。

    • 寬字符字面值:在字符串前面加L,如L“asdff”。

    • 多行字面值:兩個(gè)字符串字面值位置緊鄰且僅由空格、縮進(jìn)和換行符分割,則它們實(shí)際上是一個(gè)整體。

    • 不依賴(lài)未定義行為和機(jī)器相關(guān)行為,否則這樣的程序時(shí)不可移植的(nonportable)。

  6. 指針字面值:nullptr

變量

變量提供了程序可操作的有名字的存儲(chǔ)區(qū)
- 左值右值
  - 左值(lvalue):變量的地址,或者是一個(gè)代表“ 對(duì)象在內(nèi)存中的位置”的表達(dá)式。
  - 右值(rvalue):變量的值

變量名出現(xiàn)在賦值運(yùn)算符的左邊,就是一個(gè)左值;而出現(xiàn)在賦值運(yùn)算符右邊的變量名或字面常量就是一個(gè)右值。

    如:
    val1=val2/8
    這里的val1是個(gè)左值,而val2和8都是右值。

- 對(duì)象:內(nèi)存中具有類(lèi)型的區(qū)域
- 變量名:即變量的標(biāo)識(shí)符(identifier)。
1. 由字母、數(shù)字和下劃線(xiàn)組成.
2. 變量名必須以字母或下劃線(xiàn)開(kāi)頭,并且區(qū)分大小寫(xiě)。(函數(shù)體外的變量名不能以下劃線(xiàn)開(kāi)頭)
3. C++關(guān)鍵字不能用做標(biāo)識(shí)符
4. 不能包含兩個(gè)連續(xù)的下劃線(xiàn)
5. 不能以下劃線(xiàn)開(kāi)頭后緊跟一個(gè)大寫(xiě)字母

  • 定義對(duì)象(如:int a;)

    每個(gè)定義都是以類(lèi)型說(shuō)明符(type specifier)開(kāi)始的(如:int)

    int ival(1024);//direct-initialization,直接初始化int ival = 1024;//copy-initialization,復(fù)制初始化//注:直接初始化語(yǔ)法更靈活,且效率更高。
    • 列表初始化(list initialization)(C++11新特性)

      int ival{1024};int ival = {1024};long double ld = 3.1415926536;int a{ld}, b = {ld};    //錯(cuò)誤:轉(zhuǎn)換未執(zhí)行,因?yàn)榇嬖趤G失信息的風(fēng)險(xiǎn)int c(ld), d = ld;      //正確:轉(zhuǎn)換執(zhí)行,且丟失部分值
    • 初始化&賦值:初始化不是賦值。

    • 默認(rèn)初始化(default initialized):如果內(nèi)置類(lèi)型的變量未被顯示初始化,它的值由定義的位置決定。定義于任何函數(shù)體之外的變量被初始化為0,內(nèi)部的將不被初始化。

    • 建議初始化每個(gè)內(nèi)置型變量,以保證程序安全。

    • 初始化

  • 變量的聲明

    extern int i;   //聲明i而非定義iint j;          //定義j
    • 變量只能被定義一次,但能被多次聲明。

    • 如果要在多個(gè)文件中使用同一個(gè)變量,就必須將聲明和定義分離。變量的定義必須出現(xiàn)且只能處在在一個(gè)文件中,而其他用到該變量的文件必須對(duì)其進(jìn)行聲明,卻決不能重復(fù)定義。

    • 如果想聲明一個(gè)變量而非定義它,在變量名前加關(guān)鍵字extern,且不要顯示地初始化變量:

  • 變量名的作用域(scope):以花括號(hào)分隔

    全局作用域(global scope)

    塊作用域(block scope)

復(fù)合類(lèi)型(compound type)

  • 引用(reference),此處指左值引用(lvalue reference)。

    int ival = 1024;int &refVal = ival; //refVal指向ival(是ival的另一個(gè)名字)int &refVal;       //報(bào)錯(cuò),引用必須被初始化
    • 引用不是對(duì)象,只是已經(jīng)存在的對(duì)象的另一個(gè)名字。程序?qū)⒁煤退某跏贾?strong>綁定(bind)在一起,而不是直接將初始值拷貝給引用。

  • 指針(pointer)

    int i = 42;     
    int &r = i;     //&緊隨類(lèi)名出現(xiàn),因此是聲明的一部分,r是一個(gè)引用int *p;         //*緊隨類(lèi)名出現(xiàn),因此是聲明的一部分,p是一個(gè)指針p = &i;         //&出現(xiàn)在表達(dá)式中,是一個(gè)取地址符*p = i;         //*出現(xiàn)在表達(dá)式中,是一個(gè)解引用符int &r2 = *p;
    • 指針是對(duì)象,允許賦值和拷貝,且在指針的生命周期內(nèi)它可以先后指向不同的幾個(gè)對(duì)象。

    • 指針無(wú)需在定義時(shí)賦值。

    • 指針類(lèi)型和它所指向的對(duì)象的類(lèi)型必須匹配。

      int *ip1, *ip2;int val = 4;int *p = &val;
    • 如果指針指向了一個(gè)對(duì)象,則允許用解引用符(操作符*)來(lái)訪(fǎng)問(wèn)該對(duì)象:

      int ival - 42;int *p = &ival;cout << *p;     //由符號(hào)*得到指針p所指的對(duì)象,輸出42*p = 0;         //由符號(hào)*得到指針p所指的對(duì)象,即可經(jīng)由p為變量ival賦值cout << *p;     //輸出0
    • 符號(hào)的含義由上下文決定

  • 空指針

int *p1 = nullptr;int *p2 = 0;int *p3 = NULL;     //需要首先#include cstdlib
  • 建議初始化所有指針

  • 面對(duì)一條比較復(fù)雜的指針或引用的聲明語(yǔ)句時(shí),從右向左閱讀有助于弄清它的真實(shí)含義。

const限定符

定義常量。
- 指針和const
- 頂層const(top-level const):表示指針本身是個(gè)常量
- 底層const(low-level condt):表示指針?biāo)傅膶?duì)象是個(gè)常量

  • 指向常量的指針(pointer to const)

    const double pi = 3.14;double *ptr = &pi;          //錯(cuò)誤!const double *cptr = &pi;   //正確*cptr = 42;                 //錯(cuò)誤!cptr指向常量,不能向常量賦值double dval = 3.14;
    cptr = &dval;               //正確,但不能通過(guò)cptr改變dval的值,因?yàn)閏ptr以為自己指向的是常量
  • 常量指針(const pointer)

    int errNum = 0;int *const curErr = &errBum;    //curErr將一直指向errNumconst double pi = 3.14;const double *const pip = &pi;  //pip是一個(gè)指向常量對(duì)象的常量指針
  • constexpr和常量表達(dá)式

    • C++11新標(biāo)準(zhǔn):將變量聲明為constexpr類(lèi)型以便由編譯器來(lái)驗(yàn)證變量的值是否是一個(gè)常量表達(dá)式。(用const,有些常量的具體值直到運(yùn)行時(shí)才能獲?。?/p>

    • 在constexpr聲明中如果定義了一個(gè)指針,限定符僅對(duì)指針有效,與指針?biāo)膶?duì)象無(wú)關(guān)。也就是說(shuō)它把所定義的對(duì)象置為頂層const。

      const int *p = nullptr;     //p是一個(gè)指向常量的普通指針constexpr int *q= nullptr;  //q是一個(gè)常量指針constexpr int i = 42;constexpr const *p = &i;

處理類(lèi)型

  • 類(lèi)型別名(type alias)

    • typedef

      typedef double wages;   //wages是double的同義詞
      typedef wages base, *p; //base是double的同義詞,p是double*的同義詞

    • 別名聲明(alias declaration)

      using S1 = Sales_item;  //S1是Sales_item的同義詞

  • auto類(lèi)型說(shuō)明符

    • 讓編譯器替代我們?nèi)シ治霰磉_(dá)式所屬的類(lèi)型。

    • auto一般會(huì)忽略頂層const

      const int i =1;     //i是整型常量
      auto b = i;         //b是一個(gè)整數(shù)
      const auto c = i;   //c是整型常量

  • decltype類(lèi)型指示符

    const int ci = 0, &cj = ci; 
    decltype(ci) x = 0;         //x的類(lèi)型是const intdecltype(cj) y = x;         //y的類(lèi)型是const int&,y綁定到變量xdecltype(cj) z;             //錯(cuò)誤:z是一個(gè)引用,必須初始化
    int i = 42, *p = &i, &r = i;
    decltype(r + 0) b;  //正確:加法的結(jié)果是int,因此b是一個(gè)未初始化的intdecltype(*p) c;     //錯(cuò)誤:c是int&,必須初始化
    • decltype((v))(注意雙層括號(hào))的結(jié)果永遠(yuǎn)是引用。

    • decltype處理頂層const和引用的方式與auto有些許不同。如果decltype使用的表達(dá)式是一個(gè)變量,則decltype返回該變量的類(lèi)型(包括頂層const和引用在內(nèi))。

自定義數(shù)據(jù)結(jié)構(gòu)

  • 頭文件通常包含哪些只能被定義一次的實(shí)體,如類(lèi)、const和constexpr變量等。

  • 預(yù)處理器(preprocessor):如#include,當(dāng)預(yù)處理器看到#include標(biāo)記時(shí)就會(huì)用指定的頭文件內(nèi)容替代#include。

  • 頭文件保護(hù)符(header guard):有效防止重復(fù)包含發(fā)生

    • 一般把預(yù)處理變量的名字全部大寫(xiě)

      #ifdef      //當(dāng)且僅當(dāng)變量已定義時(shí)為真
      #ifndef     //當(dāng)且僅當(dāng)變量未定義是為真
      #define     //把一個(gè)名字設(shè)定為預(yù)處理變量
      #endif      //與#ifdef和#ifndef匹配,執(zhí)行它們的后續(xù)操作知道#endif指令止

#ifndef SALES_DATA_H#define SALES_DATA_H#include <string>struct Sales_data {    ... //此處省略
};#endif

參考:C++Primer第五版

以上是“C++中變量和基本類(lèi)型的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

c++
AI