首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C++ Primer 第5版:常量表達式與字面值類型概念辨析

     編輯:程式設計綜合問答

初學者常見誤區

書中定義:「常量表達式是指值不會改變並且在編譯過程中就能得到結果的表達式。顯然,字面值屬於常量表達式。」

又云:「字面值類型包括算術類型、引用和指針。」

疑問:int a = 42; 中 a 是整型變量,屬於字面值類型,那它是否也是常量表達式?

核心概念釐清

1. 表達式 vs 變量

C++ 中「表達式」是一個廣義概念:

  • 42 — 字面值,也是常量表達式
  • a — 變量名,是表達式,但不是常量表達式(值可變)
  • a + 42 — 算術表達式
  • a = 42 — 賦值表達式

2. 字面值類型 vs 字面值

概念說明例子
字面值類型類型分類:標量類型、引用、指針等int, double&, int*
字面值代碼中直接書寫的固定值42, 3.14, "hello"
常量表達式編譯期可求值且不變的表達式42, sizeof(int), const int x = 10

3. 關鍵區別


int a = 42;        // a 是「整型字面值類型」的「變量」
const int b = 42;  // b 是「常量表達式」(編譯期已知、不可變)

a 的類型是字面值類型,但 a 本身是變量,其值運行期可改變,故不是常量表達式。

中文翻譯陷阱

原版英文區分:

  • Literal type — 字面值類型(類型屬性)
  • Literal — 字面值(值的表現形式)
  • Constant expression — 常量表達式(編譯期計算屬性)

中文版易混淆「字面值類型」與「字面值」,導致概念模糊。建議對照原版閱讀。

實戰判斷技巧

能用於 數組長度、模板參數、enum 值、constexpr 變量初始化 的,才是常量表達式:


constexpr int size = 10;      // ✓
int arr[size];                // ✓
template int N; void foo() {} // ✓

int a = 42;
int arr2[a];                  // ✗ 非 C++ 標準(VLA)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved