亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C++11中l(wèi)onglong超長整型和nullptr初始化空指針

 更新時(shí)間:2022年12月31日 10:01:19   作者:crossoverpptx  
本文介紹?C++11?標(biāo)準(zhǔn)中新添加的?long?long?超長整型和?nullptr?初始化空指針,在?C++11?標(biāo)準(zhǔn)下,相比?NULL?和?0,使用?nullptr?初始化空指針可以令我們編寫的程序更加健壯,本文結(jié)合示例代碼給大家詳細(xì)講解,需要的朋友跟隨小編一起看看吧

本文介紹 C++11 標(biāo)準(zhǔn)中新添加的 long long 超長整型和 nullptr 初始化空指針。

1. C++11:long long 超長整型

C++ 11 標(biāo)準(zhǔn)中,基于整數(shù)大小的考慮,共提供了如下表所示的這些數(shù)據(jù)類型。與此同時(shí),標(biāo)準(zhǔn)中還明確限定了各個(gè)數(shù)據(jù)類型最少占用的位數(shù)。

整數(shù)類型等價(jià)類型C++11標(biāo)準(zhǔn)規(guī)定占用最少位數(shù)
shortshort int(有符號短整型)至少 16 位(2 個(gè)字節(jié))
signed shortshort int(有符號短整型)至少 16 位(2 個(gè)字節(jié))
signed short intshort int(有符號短整型)至少 16 位(2 個(gè)字節(jié))
unsigned shortunsigned short int(無符號短整型)至少 16 位(2 個(gè)字節(jié))
unsigned short intunsigned short int(無符號短整型)至少 16 位(2 個(gè)字節(jié))
intint(有符號整形)至少 16 位(2 個(gè)字節(jié))
signedint(有符號整形)至少 16 位(2 個(gè)字節(jié))
signed intint(有符號整形)至少 16 位(2 個(gè)字節(jié))
unsignedunsigned int(無符號整形)至少 16 位(2 個(gè)字節(jié))
unsigned intunsigned int(無符號整形)至少 16 位(2 個(gè)字節(jié))
longlong int(有符號長整形)至少 32 位(4 個(gè)字節(jié))
long intlong int(有符號長整形)至少 32 位(4 個(gè)字節(jié))
signed longlong int(有符號長整形)至少 32 位(4 個(gè)字節(jié))
signed long intlong int(有符號長整形)至少 32 位(4 個(gè)字節(jié))
unsigned longunsigned long int(無符號長整形)至少 32 位(4 個(gè)字節(jié))
unsigned long intunsigned long int(無符號長整形)至少 32 位(4 個(gè)字節(jié))
long long(C++11)long long int(有符號超長整形)至少 64 位(8 個(gè)字節(jié))
long long int(C++11)long long int(有符號超長整形)至少 64 位(8 個(gè)字節(jié))
signed long long(C++11)long long int(有符號超長整形)至少 64 位(8 個(gè)字節(jié))
signed long long int(C++11)long long int(有符號超長整形)至少 64 位(8 個(gè)字節(jié))
unsigned long long(C++11)unsigned long long int(無符號超長整型)至少 64 位(8 個(gè)字節(jié))
unsigned long long int(C++11)unsigned long long int(無符號超長整型)至少 64 位(8 個(gè)字節(jié))

C++11 標(biāo)準(zhǔn)規(guī)定,每種整數(shù)類型必須同時(shí)具備有符號(signed)和無符號(unsigned)兩種類型,且每種具體的有符號整形和無符號整形所占用的存儲空間(也就是位數(shù))必須相同。不過需要注意的是,C++11 標(biāo)準(zhǔn)中只限定了每種類型最少占用多少存儲空間,不同的平臺可以占用不同的存儲空間。

在上表羅列的這些數(shù)據(jù)類型中,long long 超長整型是 C++ 11 標(biāo)準(zhǔn)新添加的。其實(shí)早在 1995 年,就有人提議將 long long 整形寫入 C++ 98 標(biāo)準(zhǔn),但被委員會(huì)拒絕了。而后 long long 整形被 C99 標(biāo)準(zhǔn)(C語言標(biāo)準(zhǔn)之一)采納,并逐漸被很多編譯器支持,于是 C++ 標(biāo)準(zhǔn)委員會(huì)重新決定將 long long 整形寫入 C++ 11 標(biāo)準(zhǔn)中。

如同 long 類型整數(shù)需明確標(biāo)注 "L" 或者 "l" 后綴一樣,要使用 long long 類型的整數(shù),也必須標(biāo)注對應(yīng)的后綴:

  • 對于有符號 long long 整形,后綴用 "LL" 或者 "ll" 標(biāo)識。例如,"10LL" 就表示有符號超長整數(shù) 10;
  • 對于無符號 long long 整形,后綴用 "ULL"、"ull"、"Ull" 或者 "uLL" 標(biāo)識。例如,"10ULL" 就表示無符號超長整數(shù) 10。

如果不添加任何標(biāo)識,則所有的整數(shù)都會(huì)默認(rèn)為 int 類型。

對于 long long 類型來說,如果想了解當(dāng)前平臺上 long long 整形的取值范圍,可以使用<climits>頭文件中與 long long 整形相關(guān)的 3 個(gè)宏,分別為 LLONG_MIN、LLONG_MAX 和 ULLONG_MIN:
1)LLONG_MIN:代表當(dāng)前平臺上最小的 long long 類型整數(shù);
2)LLONG_MAX:代表當(dāng)前平臺上最大的 long long 類型整數(shù);
3)ULLONG_MIN:代表當(dāng)前平臺上最大的 unsigned long long 類型整數(shù)(無符號超長整型的最小值為 0)。
舉個(gè)例子:

#include <iostream>
#include <iomanip>
#include <climits>
using namespace std;

int main()
{
    cout <<"long long最大值:" << LLONG_MIN <<" "<< hex << LLONG_MIN <<"\n";
    cout << dec <<"long long最小值:" << LLONG_MAX << " " << hex << LLONG_MAX << "\n";
    cout << dec << "unsigned long long最大值:" << ULLONG_MAX << " " << hex << ULLONG_MAX;
    return 0;
}

程序執(zhí)行結(jié)果為(不唯一):

long long最大值:-9223372036854775808 8000000000000000
long long最小值:9223372036854775807 7fffffffffffffff
unsigned long long最大值:18446744073709551615 ffffffffffffffff

此程序中,輸出了各最大值和最小值對應(yīng)的十六進(jìn)制,顯然在當(dāng)前平臺(Windows10 64位操作系統(tǒng))上,long long 超長整型占用 64 位(也就是 16 個(gè)字節(jié))的存儲空間。

2. C++11:nullptr 初始化空指針

實(shí)際開發(fā)中,避免產(chǎn)生“野指針”最有效的方法,就是在定義指針的同時(shí)完成初始化操作,即便該指針的指向尚未明確,也要將其初始化為空指針。

所謂“野指針”,又稱“懸掛指針”,指的是沒有明確指向的指針。野指針往往指向的是那些不可用的內(nèi)存區(qū)域,這就意味著像操作普通指針那樣使用野指針(例如 &p),極可能導(dǎo)致程序發(fā)生異常。

C++98/03 標(biāo)準(zhǔn)中,將一個(gè)指針初始化為空指針的方式有 2 種:

int *p = 0;
int *p = NULL; //推薦使用

可以看到,我們可以將指針明確指向 0(0x0000 0000)這個(gè)內(nèi)存空間。一方面,明確指針的指向可以避免其成為野指針;另一方面,大多數(shù)操作系統(tǒng)都不允許用戶對地址為 0 的內(nèi)存空間執(zhí)行寫操作,若用戶在程序中嘗試修改其內(nèi)容,則程序運(yùn)行會(huì)直接報(bào)錯(cuò)。
相比第一種方式,我們更習(xí)慣將指針初始化為 NULL。值得一提的是,NULL 并不是 C++ 的關(guān)鍵字,它是 C++ 為我們事先定義好的一個(gè)宏,并且它的值往往就是字面量 0(#define NULL 0)。

C++ 中將 NULL 定義為字面常量 0,雖然能滿足大部分場景的需要,但個(gè)別情況下,它會(huì)導(dǎo)致程序的運(yùn)行和我們的預(yù)期不符。例如:

#include <iostream>
using namespace std;

void isnull(void *c){
    cout << "void*c" << endl;
}
void isnull(int n){
    cout << "int n" << endl;
}

int main() {
    isnull(0);
    isnull(NULL);
    return 0;
}

程序執(zhí)行結(jié)果為:

int n
int n

對于 isnull(0) 來說,顯然它真正調(diào)用的是參數(shù)為整形的 isnull() 函數(shù);而對于 isnull(NULL),我們期望它實(shí)際調(diào)用的是參數(shù)為 void*c 的 isnull() 函數(shù),但觀察程序的執(zhí)行結(jié)果不難看出,并不符合我們的預(yù)期。
C++ 98/03 標(biāo)準(zhǔn)中,如果我們想令 isnull(NULL) 實(shí)際調(diào)用的是 isnull(void* c),就需要對 NULL(或者 0)進(jìn)行強(qiáng)制類型轉(zhuǎn)換:

isnull( (void*)NULL );
isnull( (void*)0 );

如此,才會(huì)成功調(diào)用我們預(yù)期的函數(shù)。

由于 C++ 98 標(biāo)準(zhǔn)使用期間,NULL 已經(jīng)得到了廣泛的應(yīng)用,出于兼容性的考慮,C++11 標(biāo)準(zhǔn)并沒有對 NULL 的宏定義做任何修改。為了修正 C++ 存在的這一 BUG,C++ 標(biāo)準(zhǔn)委員會(huì)最終決定另其爐灶,在 C++11 標(biāo)準(zhǔn)中引入一個(gè)新關(guān)鍵字,即 nullptr。

在使用 nullptr 之前,需保證自己使用的編譯器支持該關(guān)鍵字。以 Visual Studio 和 codeblocks 為例,前者早在 2010 版本就對 C++ 11 標(biāo)準(zhǔn)中的部分特性提供了支持,其中就包括 nullptr;如果使用后者,則需將其 G++ 編譯器版本至少升級至 4.6.1(同時(shí)開啟 -std=c++0x 編譯選項(xiàng))。

nullptr 是 nullptr_t 類型的右值常量,專用于初始化空類型指針。nullptr_t 是 C++11 新增加的數(shù)據(jù)類型,可稱為“指針空值類型”。也就是說,nullpter 僅是該類型的一個(gè)實(shí)例對象(已經(jīng)定義好,可以直接使用),如果需要我們完全定義出多個(gè)同 nullptr 完全一樣的實(shí)例對象。

值得一提的是,nullptr 可以被隱式轉(zhuǎn)換成任意的指針類型。舉個(gè)例子:

int * a1 = nullptr;
char * a2 = nullptr;
double * a3 = nullptr;

顯然,不同類型的指針變量都可以使用 nullptr 來初始化,編譯器分別將 nullptr 隱式轉(zhuǎn)換成 int*、char* 以及 double* 指針類型。

另外,通過將指針初始化為 nullptr,可以很好地解決 NULL 遺留的問題,比如:

#include <iostream>
using namespace std;

void isnull(void *c){
    cout << "void*c" << endl;
}
void isnull(int n){
    cout << "int n" << endl;
}

int main() {
    isnull(NULL);
    isnull(nullptr);
    return 0;
}

程序執(zhí)行結(jié)果為:

int n
void*c

借助執(zhí)行結(jié)果不難看出,由于 nullptr 無法隱式轉(zhuǎn)換為整形,而可以隱式匹配指針類型,因此執(zhí)行結(jié)果和我們的預(yù)期相符。

總之在 C++11 標(biāo)準(zhǔn)下,相比 NULL 和 0,使用 nullptr 初始化空指針可以令我們編寫的程序更加健壯。

到此這篇關(guān)于C++11:longlong超長整型和nullptr初始化空指針的文章就介紹到這了,更多相關(guān)C++11 nullptr初始化空指針內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言數(shù)據(jù)結(jié)構(gòu)經(jīng)典10大排序算法刨析

    C語言數(shù)據(jù)結(jié)構(gòu)經(jīng)典10大排序算法刨析

    這篇文章主要介紹了C語言中常用的10種排序算法及代碼實(shí)現(xiàn),開發(fā)中排序的應(yīng)用需要熟練的掌握,因?yàn)槭腔A(chǔ)內(nèi)容,那C語言有哪些排序算法呢?本文小編就來詳細(xì)說說,需要的朋友可以參考一下
    2022-02-02
  • C生萬物C語言宏將整數(shù)二進(jìn)制位的奇偶數(shù)位交換

    C生萬物C語言宏將整數(shù)二進(jìn)制位的奇偶數(shù)位交換

    這篇文章主要為大家介紹了C生萬物C語言使用宏將整數(shù)二進(jìn)制位的奇偶數(shù)位交換示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • linux 匿名管道實(shí)例詳解

    linux 匿名管道實(shí)例詳解

    這篇文章主要介紹了linux 匿名管道實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • C語言數(shù)據(jù)結(jié)構(gòu)進(jìn)階之棧和隊(duì)列的實(shí)現(xiàn)

    C語言數(shù)據(jù)結(jié)構(gòu)進(jìn)階之棧和隊(duì)列的實(shí)現(xiàn)

    棧和隊(duì)列,嚴(yán)格意義上來說,也屬于線性表,因?yàn)樗鼈円捕加糜诖鎯壿嬯P(guān)系為 "一對一" 的數(shù)據(jù),但由于它們比較特殊,因此將其單獨(dú)作為一章,做重點(diǎn)講解
    2021-11-11
  • C++17之std::visit的具體使用

    C++17之std::visit的具體使用

    本文主要介紹了C++17之std::visit的具體使用,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • C++ 中const和復(fù)合類型

    C++ 中const和復(fù)合類型

    本文給大家講述的是C++ 中比較難理解的const和復(fù)合類型,結(jié)合自己的一些經(jīng)驗(yàn),分享給大家,希望大家能夠喜歡。
    2016-02-02
  • C++?多態(tài)虛函數(shù)的底層原理深入理解

    C++?多態(tài)虛函數(shù)的底層原理深入理解

    這篇文章主要介紹了C++?多態(tài)虛函數(shù)的底層原理深入理解,多態(tài)是在不同繼承關(guān)系的類對象,去調(diào)用同一函數(shù),產(chǎn)生了不同的行為,通常是父類調(diào)用子類的重寫函數(shù),在C++中就是?父類指針指向子類對象,此時(shí)父類指針的向下引用就可以實(shí)現(xiàn)多態(tài)
    2022-08-08
  • C語言實(shí)現(xiàn)經(jīng)典掃雷游戲流程

    C語言實(shí)現(xiàn)經(jīng)典掃雷游戲流程

    掃雷是電腦上很經(jīng)典的游戲,特意去網(wǎng)上玩了一會(huì),幾次調(diào)試之后,發(fā)現(xiàn)這個(gè)比三子棋要復(fù)雜一些,尤其是空白展開算法上和堵截玩家有的一拼,與實(shí)際游戲差別較大,不能使用光標(biāo),下面來詳解每一步分析
    2021-11-11
  • iOS鎖屏音頻播放控制及音頻信息設(shè)置

    iOS鎖屏音頻播放控制及音頻信息設(shè)置

    這篇文章主要為大家詳細(xì)介紹了iOS鎖屏音頻播放控制及音頻信息設(shè)置,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • 利用mmap實(shí)現(xiàn)文件拷貝功能

    利用mmap實(shí)現(xiàn)文件拷貝功能

    這篇文章主要為大家詳細(xì)介紹了利用mmap實(shí)現(xiàn)文件拷貝功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-10-10

最新評論