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