表達式是_運算符_和它們的_操做數_的序列,它指定一項計算。html
表達式的求值能夠產生一個結果(好比 2+2 的求值產生結果 4),也可能產生反作用(好比對 std::printf("%d",4) 的求值在標準輸出上打印字符 '4')。express
常見運算符api
賦值數組
[自增
自減](https://www.apiref.com/cpp-zh... "cpp/language/operator incdec")函數
算術ui
邏輯指針
比較code
成員訪問htm
其餘對象
a = b
a += b
a -= b
a *= b
a /= b
a %= b
a &= b
a |= b
a ^= b
a <<= b
a >>= b
++a
--a
a++
a--
+a
-a
a + b
a - b
a * b
a / b
a % b
~a
a & b
a | b
a ^ b
a << b
a >> b
!a
a && b
a || b
a == b
a != b
a < b
a > b
a <= b
a >= b
a <=> b
a[b]
*a
&a
a->b
a.b
a->*b
a.*b
a(...)
a, b
? :
特殊運算符
static_cast 轉換一個類型爲另外一相關類型
dynamic_cast 在繼承層級中轉換
const_cast 添加或移除 cv 限定符
reinterpret_cast 轉換類型到無關類型
C 風格轉型 以 static_cast
、 const_cast
及 reinterpret_cast
的混合轉換一個類型到另外一類型
new 建立有動態存儲期的對象
delete 銷燬先前由 new 表達式建立的對象,並釋放其所擁有的內存區域
sizeof 查詢類型的大小
sizeof... 查詢形參包的大小(C++11 起)
typeid 查詢類型的類型信息
noexcept 查詢表達式是否能拋出異常(C++11 起)
alignof 查詢類型的對齊要求(C++11 起)
const_cast
轉換static_cast
轉換dynamic_cast
轉換reinterpret_cast
轉換任何運算符的操做數均可以是其餘的表達式或初等表達式(例如,1+23 中 operator+ 的操做數是子表達式 23 和初等表達式 1)。
初等表達式包括如下各項:
標識表達式,包括
括號中的任何表達式也被歸類爲初等表達式:這確保了括號具備比任何運算符更高的優先級。括號保持值、類型和值類別不變。
字面量是 C++ 程序中用以表現嵌入到源代碼中的常量值的記號。
nullptr
是指針字面量,指定一個空指針值 (C++11 起)運算符 typeid
、sizeof
、noexcept
和 decltype
(C++11 起) 的操做數是不求值表達式(除非運算符爲 typeid
而操做數是多態泛左值),由於這些運算符僅查詢其操做數的編譯期性質。所以,std::size_t n = sizeof(std::cout << 42); 不進行控制檯輸出。
不求值的運算數被當作_完整表達式_,即使它們在語法上是某個更大的表達式的操做數也是如此(例如,這意味着 sizeof(T()) 要求 T::~T
可訪問)
(C++14 起)
requires 表達式也是不求值表達式。
(C++20 起)
_棄值表達式_是僅用來實施其反作用的表達式。從這種表達式計算的值被捨棄。這樣的表達式包括任何表達式語句的完整表達式,內建逗號運算符的左邊的實參,以及轉型到類型 void 的轉型表達式的實參。
棄值表達式的計算結果永遠不進行數組到指針和函數到指針轉換。當且僅當該表達式是 volatile 限定的泛左值,並具備下列形式之一(必須爲其內建含義,能夠有括號)時,進行左值到右值轉換:
此外,若該左值擁有 volatile 限定的類類型,則要求用 volatile 複製構造函數來初始化做爲結果的右值臨時量。
若是表達式(通過可能會發生的任何左值向右值轉換以後)是非 void 純右值,則進行臨時量實質化。
當表達式丟棄了聲明爲 [[[nodiscard](https://www.apiref.com/cpp-zh/cpp/language/attributes/nodiscard.html "cpp/language/attributes/nodiscard")]]
的值,而它不是轉型爲 void
的表達式時,編譯器能夠發佈警告。
(C++17 起)