最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2023年10月31日 09:13:06   作者:Totn  
這篇文章主要為大家介紹了C++左值和右值學(xué)習(xí)筆記的重點(diǎn)講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

來看一行簡單的代碼

int a = 10;

這行代碼,"=" 左邊就是左值,"="右邊的則為右值,那他們到底有什么不同呢?

如果是Java、PHP等后端同學(xué),會稱以左邊的"a"為變量,右邊的"10"為字面量,而到了C++這里,我們就需要對他理解更多一點(diǎn)。

這行代碼運(yùn)行起來,是在系統(tǒng)內(nèi)存中申請了一塊空間,命名為"a",然后把"10"這個值裝入了這個單內(nèi)存空間中,內(nèi)存中的空間是有地址的,并且和"a"這個名字綁在一起,當(dāng)我們提到"a",就能知道他所代表的內(nèi)存地址,這也是所謂的"可尋址"。

在C++中,每個表達(dá)式都具有一個值和一個類型。左值和右值描述了表達(dá)式的可尋址性和持久性。

首先,讓我們來看一下左值的概念。左值是指可以被取地址的表達(dá)式,或者說具有標(biāo)識符的表達(dá)式。左值表示一個內(nèi)存位置,它具有持久性,可以在程序的不同部分訪問和修改。簡而言之,左值可以出現(xiàn)在賦值運(yùn)算符的左邊。

左值的特點(diǎn)

int x = 10;     // 'x' 是一個左值,可以被賦值
int* p = &x;    // '&x' 是一個左值,可以取其地址
int arr[5];     // 'arr' 是一個左值,可以被訪問和修改

接下來,我們來看一下右值的概念。右值是指不可被取地址的表達(dá)式,或者說臨時生成的表達(dá)式。右值表示一個臨時的值,它通常只能用于賦值或傳遞給函數(shù),沒有持久性。簡而言之,右值可以出現(xiàn)在賦值運(yùn)算符的右邊。

右值的特點(diǎn)

int a = 5;              // '5' 是一個右值
int b = a + 3;          // 'a + 3' 是一個右值
int* ptr = new int(10); // 'new int(10)' 返回一個右值

需要注意的是,C++11引入了右值引用的概念,即可以對右值進(jìn)行引用的類型。右值引用允許我們更有效地管理資源,如移動語義和完美轉(zhuǎn)發(fā)。

綜上所述,左值表示持久的可尋址表達(dá)式,而右值表示臨時的不可尋址表達(dá)式。理解左值和右值的概念對于理解C++中的賦值、函數(shù)調(diào)用和參數(shù)傳遞等操作是非常重要的。

函數(shù)返回值

那么,一個函數(shù)返回值,應(yīng)該是左值還是右值?

當(dāng)一個函數(shù)被調(diào)用時,它會在棧上創(chuàng)建一個新的幀來存儲該函數(shù)的局部變量、參數(shù)以及其他信息。該幀在函數(shù)返回時銷毀。

因?yàn)楹瘮?shù)返回值通常是通過寄存器或者特殊寄存器(如eax)返回的,它們的地址在棧幀被銷毀后就不能再訪問了。所以不能直接對函數(shù)返回值取址。

但是,如果你需要返回一個指向已經(jīng)存在的內(nèi)存塊的指針,然后在函數(shù)外使用該指針訪問內(nèi)存塊,那么是可以的。例如:

int* foo() {
    int x = 10;
    return &x;
}

int main() {
    int* p = foo();
    std::cout << *p; // undefined behavior
    return 0;
}

上述代碼中的foo()函數(shù)返回了一個指向局部變量x的指針。

這會導(dǎo)致undefined behavior,因?yàn)閤在函數(shù)返回時就被銷毀了,所以p指向的內(nèi)存塊中可能包含任意的值。

所以,不能直接對函數(shù)返回值取址,函數(shù)返回值是一個右值。

但如何函數(shù)返回的是指向已經(jīng)存在的內(nèi)存塊的指針,即不是函數(shù)內(nèi)定義的東西,那么取址是沒有問題的。

以上就是C++左值和右值學(xué)習(xí)筆記的詳細(xì)內(nèi)容,更多關(guān)于C++左值 右值的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C++ 虛函數(shù)表圖文解析

    C++ 虛函數(shù)表圖文解析

    最近學(xué)了設(shè)計(jì)模式中的簡單工廠模式,對多態(tài)有了具體的認(rèn)識。于是補(bǔ)了補(bǔ)多態(tài)、虛函數(shù)、虛函數(shù)表相關(guān)的知識,本文介紹了C++ 虛函數(shù)表,感興趣的了解一下
    2021-05-05
  • 談?wù)凜++學(xué)習(xí)之Pair的使用方法

    談?wù)凜++學(xué)習(xí)之Pair的使用方法

    pair是一種模板類型,其中包含兩個數(shù)據(jù)值,兩個數(shù)據(jù)的類型可以不同,本篇詳細(xì)的介紹了Pair的使用方法和實(shí)例,有興趣的同學(xué)可以了解一下。
    2016-12-12
  • C++ 標(biāo)準(zhǔn)庫 <chrono>的具體使用

    C++ 標(biāo)準(zhǔn)庫 <chrono>的具體使用

    chrono>引入于 C++11,提供了類型安全的時間度量體系,本文就來詳細(xì)的介紹一下<chrono>的使用,感興趣的可以了解一下
    2026-02-02
  • C++11新特性全解析新的類功能、lambda、包裝器詳解

    C++11新特性全解析新的類功能、lambda、包裝器詳解

    本文主要介紹了C++11中新增的移動語義、默認(rèn)函數(shù)、刪除函數(shù)、override和final關(guān)鍵字,以及STL中的新容器和接口、lambda表達(dá)式、function和bind函數(shù)模板,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2026-02-02
  • C++中的std::funture和std::promise實(shí)例詳解

    C++中的std::funture和std::promise實(shí)例詳解

    在線程池中獲取線程執(zhí)行函數(shù)的返回值時,通常使用 std::future 而不是 std::promise 來傳遞返回值,這篇文章主要介紹了C++中的std::funture和std::promise實(shí)例詳解,需要的朋友可以參考下
    2024-05-05
  • 教你分辨C++堆與棧的區(qū)別

    教你分辨C++堆與棧的區(qū)別

    堆與棧的區(qū)別有:1、棧由系統(tǒng)自動分配,而堆是人為申請開辟;2、棧獲得的空間較小,而堆獲得的空間較大;3、棧由系統(tǒng)自動分配,速度較快,而堆一般速度比較慢;4、棧是連續(xù)的空間,而堆是不連續(xù)的空間
    2021-06-06
  • C++中overload,override,overwrite的區(qū)別詳細(xì)解析

    C++中overload,override,overwrite的區(qū)別詳細(xì)解析

    以下是對C++中overload,override,overwrite的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過來參考下
    2013-09-09
  • 淺談const變量賦值報(bào)錯分析

    淺談const變量賦值報(bào)錯分析

    在類中 只有靜態(tài)變量能賦值 如果你不賦值 編譯器會認(rèn)為你這個變量根本沒用 不能被修改 又沒有初始值 兩個辦法 在構(gòu)造函數(shù)的初始化列表賦值 或者在const前面加一個static
    2015-07-07
  • VScode上配置 c語言環(huán)境的圖文教程

    VScode上配置 c語言環(huán)境的圖文教程

    這篇文章主要介紹了配置VScode c語言環(huán)境,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-05-05
  • C++編譯期字符串處理方法

    C++編譯期字符串處理方法

    這篇文章給大家介紹了C++編譯期字符串處理方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2026-03-03

最新評論

鹿邑县| 富裕县| 陆丰市| 油尖旺区| 缙云县| 邵阳市| 高要市| 冷水江市| 象州县| 三台县| 岳池县| 通山县| 赤壁市| 且末县| 宝清县| 库尔勒市| 白山市| 和平区| 高平市| 吉木萨尔县| 辛集市| 西乌珠穆沁旗| 罗源县| 天镇县| 纳雍县| 盱眙县| 海晏县| 柳州市| 淄博市| 平遥县| 化州市| 修武县| 刚察县| 靖安县| 皋兰县| 蒙阴县| 乌拉特前旗| 个旧市| 永泰县| 南陵县| 汤阴县|