C++表達式

表達式是_運算符_和它們的_操做數_的序列,它指定一項計算。html

表達式的求值能夠產生一個結果(好比 2+2 的求值產生結果 4),也可能產生反作用(好比對 std::printf("%d",4) 的求值在標準輸出上打印字符 '4')。express

概述

  • 值類別(左值 (lvalue)、右值 (rvalue)、泛左值 (glvalue)、純右值 (prvalue)、亡值 (xvalue))是根據表達式的值所進行的分類
  • 實參和子表達式的求值順序指定得到中間結果所用的順序

運算符

常見運算符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_castconst_castreinterpret_cast 的混合轉換一個類型到另外一類型
new 建立有動態存儲期的對象
delete 銷燬先前由 new 表達式建立的對象,並釋放其所擁有的內存區域
sizeof 查詢類型的大小
sizeof... 查詢形參包的大小(C++11 起)
typeid 查詢類型的類型信息
noexcept 查詢表達式是否能拋出異常(C++11 起)
alignof 查詢類型的對齊要求(C++11 起)

轉換

內存分配

其餘

初等表達式

任何運算符的操做數均可以是其餘的表達式或初等表達式(例如,1+23 中 operator+ 的操做數是子表達式 23 和初等表達式 1)。

初等表達式包括如下各項:

括號中的任何表達式也被歸類爲初等表達式:這確保了括號具備比任何運算符更高的優先級。括號保持值、類型和值類別不變。

字面量

字面量是 C++ 程序中用以表現嵌入到源代碼中的常量值的記號。

  • 整數字面量是整數類型的十進制、八進制、十六進制或二進制 (C++14 起)的數值
  • 字符字面量是有下列類型之一的單個字符:
  • char 或 wchar_t
  • char16_t 或 char32_t (C++11 起)
  • char8_t (C++20 起)
  • 浮點字面量是 float、double 或 long double 類型的值
  • 字符串字面量是有下列類型之一的字符序列:
  • const char[] 或 const wchar_t[]
  • const char16_t[] 或 const char32_t[] (C++11 起)
  • char8_t (C++20 起)
  • 布爾字面量是 bool 類型的值,即 true 和 false
  • nullptr 是指針字面量,指定一個空指針值 (C++11 起)
  • 用戶定義字面量是用戶指定的類型的常量值 (C++11 起)

不求值表達式

運算符 typeidsizeofnoexceptdecltype (C++11 起) 的操做數是不求值表達式(除非運算符爲 typeid 而操做數是多態泛左值),由於這些運算符僅查詢其操做數的編譯期性質。所以,std::size_t n = sizeof(std::cout << 42); 不進行控制檯輸出。

不求值的運算數被當作_完整表達式_,即使它們在語法上是某個更大的表達式的操做數也是如此(例如,這意味着 sizeof(T()) 要求 T::~T 可訪問)

(C++14 起)

requires 表達式也是不求值表達式。

(C++20 起)

棄值表達式

_棄值表達式_是僅用來實施其反作用的表達式。從這種表達式計算的值被捨棄。這樣的表達式包括任何表達式語句的完整表達式,內建逗號運算符的左邊的實參,以及轉型到類型 void 的轉型表達式的實參。

棄值表達式的計算結果永遠不進行數組到指針和函數到指針轉換。當且僅當該表達式是 volatile 限定的泛左值,並具備下列形式之一(必須爲其內建含義,能夠有括號)時,進行左值到右值轉換:

  • 標識表達式 (id-expression)
  • 數組下標表達式
  • 類成員訪問表達式
  • 間接尋址
  • 成員指針操做
  • 條件表達式,其第二個和第三個操做數都是這些表達式中的一種
  • 逗號表達式,其右操做數是這些表達式中的一種。

此外,若該左值擁有 volatile 限定的類類型,則要求用 volatile 複製構造函數來初始化做爲結果的右值臨時量。

若是表達式(通過可能會發生的任何左值向右值轉換以後)是非 void 純右值,則進行臨時量實質化

當表達式丟棄了聲明爲 [[[nodiscard](https://www.apiref.com/cpp-zh/cpp/language/attributes/nodiscard.html "cpp/language/attributes/nodiscard")]] 的值,而它不是轉型爲 void 的表達式時,編譯器能夠發佈警告。

(C++17 起)

相關文章
相關標籤/搜索