欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++變量和基本類型詳解

 更新時(shí)間:2021年10月12日 09:59:11   作者:Binary_of  
這篇文章主要介紹了C++變量和基本類型,,一定要注意局部變量與全局變量的作用范圍,需要的朋友可以參考下,希望能夠給你帶來幫助

基本內(nèi)置類型

算術(shù)類型分為兩類:整型(包括字符和布爾類型在內(nèi))和浮點(diǎn)型

1. 不同平臺(tái)下基本類型的字節(jié)數(shù)

類型 16位平臺(tái) 32位平臺(tái) 64位平臺(tái)
char 1 1 1
short 2 2 2
int 2 4 4
long 4 4 8
long long / 8 8
指針 2 4 8
float 4 4 4
double 8 8 8

數(shù)據(jù)類型long long 是在C++11中新定義的。

2. 算數(shù)類型的最小尺寸

算術(shù)類型分為兩類:整型(包括字符和布爾類型在內(nèi))和浮點(diǎn)型

類型 含義 最小尺寸
bool 布爾類型 未定義
char 字符 8位
wchar_t 寬字符 16位
char16_t Unicode字符 16位
char32_t Unicode字符 32位
short 短整型 16位
int 整型 16位
long 長整型 32位
long long 長整型 64位
float 單精度浮點(diǎn)數(shù) 6位有效數(shù)字
double 雙精度浮點(diǎn)數(shù) 10位有效數(shù)字
long double 擴(kuò)展雙精度浮點(diǎn)數(shù) 10位有效數(shù)字

3. 數(shù)據(jù)類型選擇的經(jīng)驗(yàn)準(zhǔn)則

  • 當(dāng)知曉數(shù)值不可能為負(fù)時(shí),選用無符號(hào)類型
  • 使用int執(zhí)行整數(shù)運(yùn)算,short常常太小,long和int一般尺寸一樣。如果int不夠,用long long。
  • 在算數(shù)表達(dá)式中不要使用char或bool,使用char特別容易出問題。如果要使用一個(gè)不大的整數(shù),那么明確執(zhí)行為signed char或unsigned char。
  • 執(zhí)行浮點(diǎn)數(shù)運(yùn)算用double,float通常進(jìn)度不夠而且兩者計(jì)算代價(jià)相差無幾。Long double一般沒有必要,且消耗不容忽視。

4. 有符號(hào)類型和無符號(hào)類型

  • 無符號(hào)類型賦值超出其范圍,結(jié)果是取模后的值。如unsigned char c = -1; //假設(shè)char占8bit,c的值為255
  • 有符號(hào)類型賦值超出其范圍,結(jié)果未定義。如signed char c2 = 256; //假設(shè)char占8bit,c2的值未定義
  • 切勿混用帶符號(hào)類型和無符號(hào)類型。
  • 算數(shù)表達(dá)式中既有無符號(hào)數(shù)又有帶符號(hào)數(shù),帶符號(hào)的數(shù)會(huì)轉(zhuǎn)換成無符號(hào)的數(shù) 

5.初始化與賦值

初始化和賦值是兩個(gè)完全不同的操作。

  • 定義于任何函數(shù)體外的之外的變量被初始化成0
  • 定義于函數(shù)體(塊作用域)內(nèi)的內(nèi)置類型的對(duì)象如果沒有初始化,則其值未定義。養(yǎng)成初始化內(nèi)置變量的習(xí)慣。
  • 類的對(duì)象如果沒有顯式地初始化,則其值由類確定。

6. 聲明與定義

  • 聲明使得一個(gè)名字為程序所知,定義會(huì)申請(qǐng)存儲(chǔ)空間,還可能為其賦初始值
  • (分離式編譯) 如果想聲明一個(gè)變量而非定義它,就在變量名前添加關(guān)鍵字extern,而且不要顯式地初始化變量
  • 對(duì)于復(fù)雜的聲明語句,可以從變量名從右往左理解
  • 變量能且只能被定義一次,但是可以被多次聲明 

7. C++關(guān)鍵字

8. const

8.1 初始化

默認(rèn)狀態(tài)下,const對(duì)象僅在文件內(nèi)有效。

在編譯的過程中,編譯器會(huì)把所有用到該const變量的地方都替換成相應(yīng)的值。所以編譯器必須知道變量的初始值,如果存在多個(gè)文件的情況下,每個(gè)文件必須知道const的初始值(const對(duì)象也必須初始化)。但由于默認(rèn)狀態(tài)下,const對(duì)象僅在文件內(nèi)有效,當(dāng)多個(gè)文件同時(shí)出現(xiàn)同名的const變量時(shí),其實(shí)就相當(dāng)于分別定義了不同的變量。

如果想只定義一次怎么做呢?

只需要無論是聲明還是定義都標(biāo)記extern關(guān)鍵字即可。

//file1.cpp
extern const i=1;
//file2.cpp
extern const i;

如果想要在多個(gè)文件之間共享const 對(duì)象,必須在變量之前添加extern關(guān)鍵字

8.2 const引用

定義:把引用綁定到const對(duì)象上,即為對(duì)常量的引用(reference to const)。
引用類型必須與其所引用對(duì)象類型一致(但是有兩個(gè)例外),

8.2.1 與普通引用不同的是不能讓非常量引用指向一個(gè)常量變量。

    int i= 0;
    const int &ci = i; 
    int &ri = ci;

在這里插入圖片描述

因?yàn)榉浅A恳每梢孕薷乃壎ǖ膶?duì)象,但是常量引用不能,如果非常量引用指向一個(gè)常量變量合理的話,那么非常量引用可以修改它所綁定的對(duì)象的值,這顯然是不正確的。

8.2.2 初始化常量引用時(shí)允許將以任意表達(dá)式作為初始值,只要表達(dá)式的結(jié)果能轉(zhuǎn)換成對(duì)應(yīng)類型即可。

8.2.2.1允許常量引用綁定分常量的對(duì)象、字面值,甚至一個(gè)一般表達(dá)式

    double dval = 3.14;
    const int &ri = dval;
    std::cout<<"dval:"<<dval<<std::endl;
    std::cout<<"ri:"<<ri<<std::endl;

編譯器會(huì)將上面代碼變成:

    const int temp= dval;
    const int &ri = temp;
    std::cout<<"dval:"<<dval<<std::endl;
    std::cout<<"ri:"<<ri<<std::endl;

在這種情況下面,ri綁定了一個(gè)臨時(shí)量

ri不是常量引用的時(shí)候會(huì)發(fā)生錯(cuò)誤:

    double dval = 3.14;
    int &ri = dval; // error: invalid initialization of non-const reference of type ‘int&' from an rvalue of type ‘int'
    std::cout<<"dval:"<<dval<<std::endl;
    std::cout<<"ri:"<<ri<<std::endl;

編譯器會(huì)將上面代碼變成:

    int temp= dval;
    int &ri = temp;
    std::cout<<"dval:"<<dval<<std::endl;
    std::cout<<"ri:"<<ri<<std::endl;

由于臨時(shí)值的特殊性,程序員并不能操作臨時(shí)值,而且臨時(shí)值隨時(shí)可能被釋放掉,所以,一般說來,修改一個(gè)臨時(shí)值是毫無意義的,據(jù)此,c++編譯器加入了臨時(shí)值不能作為非const引用的這個(gè)語義限制。

8.2.2.2 const引用可能用一個(gè)非const對(duì)象

    int i =0;
    int &ri = i;
    const int &ci = i;
    ci = 2; // error: assignment of read-only reference ‘ci'

常量引用僅對(duì)引用可參與的操作做出限定,對(duì)于引用的對(duì)象本身是不是一個(gè)長量未作限定

8.3 const與指針

指針的類型必須與其所指對(duì)象的類型一致(但是有兩個(gè)例外)

允許一個(gè)指向常量的指針指向一個(gè)非常量對(duì)象.

和const引用差不多,指針常量的指針也沒有規(guī)定所指的對(duì)象必須是一個(gè)常量

8.3.1 指向常量的指針和常量指針

指向常量的指針(指針可以改變,指針的值不可變):

const int x=1;
const int *p = &x;//p為指向常量x的指針
int *p = &x; //錯(cuò)誤,因?yàn)閜只是個(gè)普通指針

常量指針(不變的指針而不是指針指向的值):

int x=0;
int *const p = &x;//p為常量指針(允許一個(gè)指向常量的指針指向一個(gè)非常量對(duì)象.)
const int xx=0;
const int *const pp= &xx;//pp為指向常量的常量指針(
    int x=0;
    int y = 11;
    const int *p = &x;//p為常量指針(允許一個(gè)指向常量的指針指向一個(gè)非常量對(duì)象.)
    int  *const cp = &x;
    const int *const pp= &x;//pp為指向常量的常量指針

    x = 1;
    std::cout<<"x:"<<x<<std::endl;
    std::cout<<"*p:"<<*p<<std::endl;
    std::cout<<"*cp:"<<*cp<<std::endl;
    std::cout<<"*PP:"<<*pp<<std::endl;
    p = &y;
    *p = 11; // error: assignment of read-only location ‘* p'
    *cp = 12;
     cp = &y;// error: assignment of read-only variable ‘cp'
    std::cout<<"*p:"<<*p<<std::endl;
    std::cout<<"*cp:"<<*cp<<std::endl;

小結(jié):

常量指針,指針本身是一個(gè)常量,不可以改變指向的對(duì)象,但是可以改變指向?qū)ο蟮闹?可以使用解引符改變地址所指向的值
指向常量的指針,可以重新指定指向新的對(duì)象,但是不可以改變對(duì)象的值.

    int errNumb =0;
    int *const curErr = &errNumb; // curerr 將一直指向errNumb errNumb 的值變化了curerr的值也跟著變化
    const double pi = 3.14159;
    const double *const pip = &pi; // pip 是一個(gè)指向常量對(duì)象的常量指針
    std::cout<<"curErr:"<<*curErr<<std::endl;
    std::cout<<"pip:"<<*pip<<std::endl;
    errNumb =1;
    std::cout<<"curErr:"<<*curErr<<std::endl;

輸出:

curErr:0

pip:3.14159

8.3.2 頂層const和底層const

指針如果添加const修飾符時(shí)有兩種情況:

頂層const:表示指針本身是一個(gè)常量
底層const:表示指針?biāo)赶虻膶?duì)象是一個(gè)常量

9. constexpr 和常量表達(dá)式

常量表達(dá)式(const experssion):是指
1.值不會(huì)改變 并且
2.在編譯過程就能得到計(jì)算結(jié)果的表達(dá)式。

字面量屬于常量表達(dá)式,用常量表達(dá)式初始化的const對(duì)象也是常量表達(dá)式。

9. 1 constexpr 變量:

一般來說,如果 你認(rèn)定變量是一個(gè)常量表達(dá)式,那就把它聲明成constexpr類型函數(shù):

constexpr函數(shù)是指能用于常量表達(dá)式的函數(shù)。

應(yīng)遵循的約定:函數(shù)返回類型及所有形參的類型都是字面值類型,而且函數(shù)體中必須有且只有一條return 語句。

constexpr函數(shù)體內(nèi)可以有其他語句,只要這些語句在運(yùn)行時(shí)不執(zhí)行任何操作。(例如,空語句、類型別名和using聲明等)

constexpr函數(shù)被隱式地指定為內(nèi)聯(lián)函數(shù)。

9. 2字面值類型

常量表達(dá)式的值需要在編譯時(shí)就得到計(jì)算,因此對(duì)聲明constexpr時(shí)用到的類型必須有所限制。因?yàn)檫@些類型一般比較簡單,值也顯而易見、容易得到,就把它們稱為“字面值類型”(literal type)。

字面值類型范圍:

算術(shù)類型、引用和指針都屬于字面值類型。某些類也是字面值類型,它們可能含有constexpr函數(shù)成員。自定義類Sales_item、IO庫、string類型不屬于字面值類型。

9. 3constexpr 和指針

盡管指針和引用可以定義成constexpr,但它們的初始值受到嚴(yán)格限制。一個(gè)constexpr指針的初始值必須是nullptr、0或存儲(chǔ)于某個(gè)固定地址中的對(duì)象。

constexpr int *q = nullprt 等價(jià)于 int const *q = nullprt

函數(shù)體內(nèi)定義的變量一般來說并非存放在固定地址中,因此constexpr指針不能指向這樣的變量。定義于函數(shù)體外的對(duì)象其地址固定不變,能用來初始化constexpr指針。

允許函數(shù)定義一類有效范圍超出函數(shù)本身的變量,如局部靜態(tài)變量,這類變量和定義在函數(shù)體之外的變量一樣有固定地址,因此constexpr引用能綁定到這樣的變量上,constexpr指針也能指向這樣的變量。

10. 處理類型

10.1 類型別名 typeof

typedef double a;
typedef wages base,*p; //等價(jià)于 double base ,*p;

using

using SI = Sales_item;
SI item;//等價(jià)于 Sales_item item;

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • C語言實(shí)現(xiàn)打印星號(hào)圖案

    C語言實(shí)現(xiàn)打印星號(hào)圖案

    這篇文章主要介紹了C語言實(shí)現(xiàn)打印星號(hào)圖案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • 關(guān)于背包問題的一些理解和應(yīng)用

    關(guān)于背包問題的一些理解和應(yīng)用

    這篇文章主要介紹了關(guān)于背包問題的一些理解和應(yīng)用,本文可以說是背包問題九講的補(bǔ)充、讀后感,需要的朋友可以參考下
    2014-08-08
  • 簡單談?wù)凜++中指針與引用的區(qū)別

    簡單談?wù)凜++中指針與引用的區(qū)別

    指針和引用在C++中很常用,但是對(duì)于它們之間的區(qū)別很多初學(xué)者都不是太熟悉,下面來談?wù)勊麄?者之間的區(qū)別和用法
    2017-04-04
  • Opencv處理圖像之輪廓提取

    Opencv處理圖像之輪廓提取

    這篇文章主要為大家詳細(xì)介紹了Opencv處理圖像之輪廓提取,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • 深入理解C語言sizeof()計(jì)算空間大小為8的問題

    深入理解C語言sizeof()計(jì)算空間大小為8的問題

    本文將介紹C語言中的sizeof()函數(shù),以及如何使用它來計(jì)算變量、數(shù)據(jù)類型和數(shù)組在內(nèi)存中的大小,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-09-09
  • C語言中#pragma預(yù)處理指令的使用

    C語言中#pragma預(yù)處理指令的使用

    在所有的預(yù)處理指令中,#pragma指令可能是最復(fù)雜的了,它的作用是設(shè)定編譯器的狀態(tài)或者是指示編譯器完成一些特定的動(dòng)作,本文主要介紹了C語言中#pragma預(yù)處理指令的使用,感興趣的可以了解一下
    2023-12-12
  • 淺析VSCode launch.json中的各種替換變量的意思 ${workspaceFolder} ${file} ${fileBasename} ${fileDirname}等

    淺析VSCode launch.json中的各種替換變量的意思 ${workspaceFolder} ${file} $

    這篇文章主要介紹了VSCode launch.json中的各種替換變量的意思 ${workspaceFolder} ${file} ${fileBasename} ${fileDirname}等,非常不錯(cuò)具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03
  • C語言 map函數(shù)的基礎(chǔ)用法詳解

    C語言 map函數(shù)的基礎(chǔ)用法詳解

    這篇文章主要為大家介紹了C語言 map函數(shù)的基礎(chǔ)用法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • C++左值和右值學(xué)習(xí)筆記

    C++左值和右值學(xué)習(xí)筆記

    這篇文章主要為大家介紹了C++左值和右值學(xué)習(xí)筆記的重點(diǎn)講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • C標(biāo)準(zhǔn)庫<assert.h>的實(shí)現(xiàn)詳解

    C標(biāo)準(zhǔn)庫<assert.h>的實(shí)現(xiàn)詳解

    這篇文章主要介紹了C標(biāo)準(zhǔn)庫<assert.h>的實(shí)現(xiàn),主要包括了<assert.h>的基本概念、實(shí)現(xiàn)及用法等,需要的朋友可以參考下
    2014-09-09

最新評(píng)論