都要畢業(yè)了,C/C++ 的左值和右值還傻傻分不清楚?

勵志當(dāng)最強(qiáng)課代表的我來給大家總結(jié)總結(jié)??????
C/C++ 的左值和右值還傻傻分不清楚?
視頻內(nèi)容:
1??左值和右值??
2??表達(dá)式??
視頻內(nèi)容:
1??左值和右值??
左值和右值的概念早在C++98的時候就已經(jīng)出現(xiàn)了,從最簡單的字面理解,無非是表達(dá)式等號左邊的值為左值,而表達(dá)式右邊的值為右值,比如:

以上面的代碼為例,x是左值,1是右值; y是左值,3是右值;z是左值,x+y的結(jié)果是右值。用表達(dá)式等號左右的標(biāo)準(zhǔn)區(qū)分左值和右值雖然在一些場景下確實能得到正確結(jié)果,但是還是過于簡單,有些情況下是無法準(zhǔn)確區(qū)分左值和右值的

2??表達(dá)式??
按照表達(dá)式等號左右的區(qū)分方式,在第一行代碼中,是左值,1是右值;在第二行代碼中b是左值,而a是右值。這里出現(xiàn)了矛盾,在第一行代碼中我們判斷o是一個左值,它卻在第二行變成了右值,很明顯這不是想要的結(jié)果,要準(zhǔn)確地區(qū)分左值和右值還是應(yīng)該理解其內(nèi)在含義。

最后需要強(qiáng)調(diào)的是,通常字面量都是一個右值,除字符串字面量以外:

這一點非常容易被忽略,上面的代碼中前兩行的:和6都是右值,因為不存在&和&s6的語法,這會讓我們想當(dāng)然地認(rèn)為"hellg world"也是一個右值,畢竟&"hello worle的語法也很少看到。但是這段代碼是可以編譯成功的。其實原因仔細(xì)想來也很簡單。編譯器會將字符串字面量存儲到程序的數(shù)據(jù)段中,程序加載的時候也會為其開辟內(nèi)存空間。所以我們可以使用取地址符&來獲取字符串字面量的內(nèi)存地址。