程式語言中的常量摺疊(const folding)

2021-07-08 13:41:30 字數 834 閱讀 2101

考慮這樣一段**:

for (int i = 0; i

< 200*800*700; ++i)

該迴圈的條件(i<200*700*800)是乙個表示式(expression),如果放到判斷時再求值那麼200*700*800的計算將會進行112000000次。如果編譯器在語法分析階段進行常量合併,該迴圈將會變為這樣:

for (int i = 0; i

< 112000000; ++i)

我們再來看一次沒那麼直觀的例子,本質仍然針對常量進行的常量摺疊:

const

int i = 0;

int* pi = const_cast

(&i);

// const_cast消除常量性

*pi = 5;

cout

<< "&i = "

<< &i << ", pi = "

<< pi << std::endl;

cout

<< "i = "

<< i << ", *pi = "

<< *pi << std::endl;

詭異的事情發生了:

&i = 001ef788, pi = 001ef788

i = 0, *pi = 5

可見這裡的常量(被const修飾)i的值被放入常量表中,輸出時輸出的是常量表中對應的值。而在執行階段,它在記憶體裡存的實體也確確實實改變了,但這並未影響常量表對中對應的值。

C語言中const定義常量和巨集常量的區別

2.巨集常量 3.兩者區別 關鍵字const 定義的是變數不是常量,而是去改變乙個變數的儲存類,把該變數所佔的記憶體變為唯讀。這就是變數的值不允許改變的常變數。該常量帶有資料型別。編譯執行的時候起作用存在型別檢查。include const int a 1 const static int b vo...

c和c 中的const與常量摺疊

c中const修飾的是唯讀變數,c 中const修飾的是常量 在c c 中const在使用並無太大區別,只是c 對const更為嚴格,並且對const修飾的量進行了常量摺疊。先看如下例子,例子中不只測試c c 中const 的區別,也順便測試了const int 指標與int const指標的區別 ...

GO語言 const常量

單行常量宣告,宣告時必須指定值,且無法修改 const pi 3.14多行常量宣告,若省略賦值,則預設與上一行值相同 const a 100 b 200 c c 200 d d 200 const aa iota 0 bb bb iota 1 cc cc iota 2 dd dd iota 3 co...