C grammar 斷言與表示式常量

2021-10-10 06:18:20 字數 2585 閱讀 7784

3、宣告與定義

常量表示式是編譯期間就能計算其結果的表示式。

const修飾的物件既可能是編譯期常量,也可能是執行期常量。

constexpr說明符宣告可在編譯時計算函式或變數的值

constexpr

intmax

(int a ,

int b)

intmain()

const用來告知程式設計師const指向的內容不可被修改,主要目的是為了避免寫出bug。

constexpr在所有編譯期常量的地方做限定。使得constexpr修飾的語句在編譯期即可計算得到值。讓編譯期優化**效能。

constexpr修飾的函式,要滿足什麼條件才能成為編譯期常量表示式?

constexpr 函式的返回值必須在編譯時就能被確定。

斷言是一條檢測假設成立與否的語句。

斷言assert是乙個巨集,而非乙個函式。

static_assert 是乙個關鍵字,而非乙個函式。

用法:包含標頭檔案 以除錯模式編譯程式

//assert( bool_expr ); // bool_expr 為假則中斷程式

std::array a

;//c++17 型別引數推導

for(size_t i =

0; i <= a.

size()

; i++

)

上面示例的第6行**中,若assert中斷了程式則表明程式出bug了!程式設計師要重編**解決這個bug,而不是把assert()放在那裡當成正常程式的一部分

assert斷言中所用的表示式可以不是是編譯期常量表示式。

2.1. static_assert ( bool_constexpr, message)

其中兩個引數解釋如下:(1

) bool_constexpr: 編譯期常量表示式,可轉換為bool 型別(2

) message: 字串字面量 ,是斷言失敗時顯示的警告資訊。自c++

17起,message是可選的

// 下面的語句能夠確保該程式在32位的平台上編譯進行。

// 如果該程式在64位平台上編譯,就會報錯 (例子來自msdn)

static_assert

(sizeof

(void*)

==4,"64-bit code generation is not supported."

);

常用在模版程式設計中 ,對寫庫的作者用處大

在static_assert的第乙個引數 bool_constexpr 中不能有變數表示式

這裡我們指的是assert,執行期的斷言。

若某些狀況是你預期中的,那麼用錯誤處理;若某些狀況永不該發生,用斷言)

int n

, m;

std::cin >> n;

assert

((n !=0)

&&"divisor cannot be zero!");

// 不合適

int q = m / n;

int n

, m;

dowhile

(n ==0)

;// 在這裡編寫修復bug的**

assert

((n !=0)

&&"divisor cannot be zero!");

int q = m / n;

下面的例子說明了在編譯期,靜態斷言就已經執行了,因為array的nums在編譯期就應該知道它的值。

「宣告」是引入識別符號並描述其型別,無論是型別,物件還是函式。編譯器需要該「宣告」,以便識別在它處使用該識別符號。

extern

int bar;

extern

intg

(int

,int);

doublef(

int,

double);

// extern can be omitted for function declarations

class

foo;

// no extern allowed for type declarations

「定義」例項化/實現這個識別符號。鏈結器需要「定義」,以便將對識別符號的引用鏈結到識別符號所表示的實體。

int bar;

intg

(int lhs,

int rhs)

doublef(

int i,

double d)

class

foo;

1、定義有時可取代宣告,反之則不行

2、識別符號可被宣告多次,但只能定義一次

3、 定義通常伴隨著編譯器為識別符號分配記憶體

正規表示式 常用表示式

羅馬數字 string p1 m d?c c dm l?x x lc v?i i vx string t1 vii match m1 regex.match t1,p1 交換前二個單詞 string t2 the quick brown fox string p2 s s s regex x2 ne...

C 指標 表示式 常量

一 指標 在計算機語言中,由於通過位址能找到所需的變數,可以說位址指向該變數單元,因此把位址形象的稱為 指標 意思是能通過它來找到以它為位址的記憶體單元。1.1 指標 變數 指標變數與普通變數一樣,使用之前不僅要定義說明而且必須要賦具體的值,未經賦值的指標變數不能使用 可以對指標變數初始化為null...

正規表示式常用

正規表示式的介紹 1 資料型別 基本資料型別 number string boolean null undefined 複雜資料型別 array function object math date regexp正規表示式 string number boolean 2 regular express...