一、概念
定義:表達(dá)式由一到多個操作數(shù)組成,可以求值并通常會返回求值結(jié)果;
最基本表達(dá)式:變量、字面值,通常包含操作符;
操作符特性:
- 1、接收幾個操作數(shù):一元、二元、三元;
- 2、對類型有要求(可能涉及類型轉(zhuǎn)換);
- 3、操作數(shù)是左值還是右值;
- 4、結(jié)果的類型;
- 5、結(jié)果是左值還是右值;
- 6、優(yōu)先級與結(jié)合性,可用小括號來改變運算順序;
- 7、 操作符重載:不改變接收操作數(shù)的個數(shù)、優(yōu)先級與結(jié)合性;
注意:關(guān)于操作符優(yōu)先級問題可以參考文檔
二、左值與右值
參考網(wǎng)站
在C語言中:左值可能放在等號左邊,右值只能放在等號右邊;
在C++中,左值也不一定能放在等號左邊,右值也可能放在等號左邊;
值類型關(guān)系圖:
- glvalue:泛左值,標(biāo)識一個對象、位或函數(shù);
- pvalue:純右值,用于初始化對象或作為操作數(shù);
- xvalue:亡值,表示其資源可以被重新使用;
C++是支持左值和右值的轉(zhuǎn)換的;
decltype可以接收表達(dá)式,并且根據(jù)類型不同產(chǎn)生不同的值:
參考文章:decltype 說明符
- 表達(dá)式的值類別為純右值,則為type;
- 表達(dá)式的值類別為純左值,則為type& ;
- 表達(dá)式的值類別為亡值,則為type&& ;
三、類型轉(zhuǎn)換
定義:一些操作符要求其操作數(shù)具有特定的類型,或者具有相同的類型,此時可能產(chǎn)生類型轉(zhuǎn)換;
隱式類型轉(zhuǎn)換:編譯器自動發(fā)生的;
顯式類型轉(zhuǎn)換:
- 1、static_cast<新類型> (表達(dá)式);
- 2、const_cast<新類型> (表達(dá)式):去除常量性或增加常量性;
- 3、顯示引入的轉(zhuǎn)換;
四、操作符
- 算數(shù)運算符中,除邏輯非外,其它操作符都是左結(jié)合的;
- 邏輯與、邏輯或具有短路特性;
- 邏輯與&&優(yōu)先級高于邏輯或||;
- 按位取反符:~ 按位與:& 按位或:| 按位異或:^ 移位操作符:<<、>>
- 移位操作在一定程度上是乘以或除以2的冪,但速度更快;
- 賦值操作符是右結(jié)合的;
- 還有一些其他操作符,比如成員訪問操作符.和->,條件操作符?:等,在這就不做介紹了;
五、思考
1、思考下面x變量是左值還是右值,有什么特性?
const int x = 3; ?
x是一個純左值,由于系統(tǒng)內(nèi)部為常量,所以不能放在等號左邊;
2、思考一下以下賦值操作符的原始代碼是怎樣的?
int x; int y; x = y = 5;
首先賦值操作符是右結(jié)合的,先計算y=3,并且不是把y的值賦予給x,而是這個表達(dá)式的返回值賦予x,原始代碼如下:
x = (y = 3);
可以通過https://cppinsights.io/這個網(wǎng)站,看出C++內(nèi)部對一些代碼的轉(zhuǎn)換處理;
3、思考以下代碼做了什么事情?
int x = 2; int y = 3; x^=y^=x^=y;
答案就是通過復(fù)合賦值操作,交換了x和y的值,詳細(xì)也和異或這個操作符有關(guān);
總結(jié):
? 表達(dá)式這個概念在C++中屬于比較細(xì)節(jié)的知識了,很多時候我們只用知道怎么用,對于編譯器內(nèi)部怎么處理我們并不關(guān)心;并且關(guān)于左值和右值這個概念,也是C++比較深的一個小知識點,了解后對于程序的優(yōu)化是有很大幫助的,本篇重點需要關(guān)注左值和右值,多參考官方cppreferenc的文檔,這是最權(quán)威的說明文檔;
到此這篇關(guān)于C++中的Lambda表達(dá)式及表達(dá)式語句的文章就介紹到這了,更多相關(guān)C++ Lambda表達(dá)式內(nèi)容請搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!