C++ 笔记(07)— 常量(字面常量、const定义常量、constexpr 定义常量、enum 定义常量、define 定义常量)
在 C++ 中,常量類似于變量,只是不能修改。與變量一樣,常量也占用內(nèi)存空間,并使用名稱標(biāo)識為其預(yù)留的空間的地址,但不能覆蓋該空間的內(nèi)容。
常量可以是任何的基本數(shù)據(jù)類型,可分為整型數(shù)字、浮點數(shù)字、字符、字符串和布爾值。在 C++ 中,常量可以是:
- 字面常量;
- 使用關(guān)鍵字
const聲明的常量; - 使用關(guān)鍵字
constexpr聲明的常量表達式(C++11新增的); - 使用關(guān)鍵字
enum聲明的枚舉常量; - 使用
#define定義的常量(已摒棄,不推薦);
1. 字面常量
字面常量可以是任何類型:布爾型、整型、浮點型、字符、字符串等。
1.1 整型常量
整型常量可以是十進制、八進制或十六進制的常量。前綴指定基數(shù):
0x或0X表示十六進制;0表示八進制;- 不帶前綴則默認表示十進制;
整數(shù)常量也可以帶一個后綴,后綴是 U 和 L 的組合:
U表示無符號整數(shù)(unsigned);L表示長整數(shù)(long);
后綴可以是大寫,也可以是小寫, U 和 L 的順序任意。下面列舉幾個整數(shù)常量的實例:
212 // 合法的
215u // 合法的
0xFeeL // 合法的
078 // 非法的:8 不是八進制的數(shù)字
032UU // 非法的:不能重復(fù)后綴
以下是各種類型的整數(shù)常量的實例:
85 // 十進制
0213 // 八進制
0x4b // 十六進制
30 // 整數(shù)
30u // 無符號整數(shù)
30l // 長整數(shù)
30ul // 無符號長整數(shù)
1.2 浮點常量
浮點常量由整數(shù)部分、小數(shù)點、小數(shù)部分和指數(shù)部分組成。您可以使用小數(shù)形式或者指數(shù)形式來表示浮點常量。
- 當(dāng)使用小數(shù)形式表示時,必須包含整數(shù)部分、小數(shù)部分,或同時包含兩者。
- 當(dāng)使用指數(shù)形式表示時, 必須包含小數(shù)點、指數(shù),或同時包含兩者。帶符號的指數(shù)是用 e 或 E 引入的。
下面列舉幾個浮點常量的實例:
3.14159 // 合法的
314159E-5L // 合法的
510E // 非法的:不完整的指數(shù)
210f // 非法的:沒有小數(shù)或指數(shù)
.e55 // 非法的:缺少整數(shù)或分數(shù)
1.3 布爾常量
布爾常量共有兩個,它們都是標(biāo)準(zhǔn)的 C++ 關(guān)鍵字:
true值代表真;false值代表假;
1.4 字符常量
字符常量是括在單引號中。
- 如果常量以
L(僅當(dāng)大寫時)開頭,則表示它是一個寬字符常量(例如L'x'),此時它必須存儲在wchar_t類型的變量中; - 否則,它就是一個窄字符常量(例如
x),此時它可以存儲在char類型的簡單變量中;
字符常量可以是一個普通的字符(例如 'x' )、一個轉(zhuǎn)義序列(例如 '\t'),或一個通用的字符(例如 '\u02C0')。
在 C++ 中,有一些特定的字符,當(dāng)它們前面有反斜杠時,它們就具有特殊的含義,被用來表示如換行符( \n )或制表符( \t )等。下表列出了一些這樣的轉(zhuǎn)義序列碼:
| 轉(zhuǎn)義序列 | 含義 |
|---|---|
| \\ | \ 字符 |
| \’ | ’ 字符 |
| \" | " 字符 |
| \? | ? 字符 |
| \a | 警報鈴聲 |
| \b | 退格鍵 |
| \f | 換頁符 |
| \n | 換行符 |
| \r | 回車 |
| \t | 水平制表符 |
| \v | 垂直制表符 |
| \ooo | 一到三位的八進制數(shù) |
| \xhh . . . | 一個或多個數(shù)字的十六進制數(shù) |
1.5 字符串常量
字符串字面值或常量是括在雙引號 "" 中的。一個字符串包含類似于字符常量的字符、普通的字符、轉(zhuǎn)義序列和通用的字符。
可以使用空格做分隔符,把一個很長的字符串常量進行分行。
下面的實例顯示了一些字符串常量。下面這三種形式所顯示的字符串是相同的。
"hello, dear""hello, \dear""hello, " "d" "ear"
2. 使用 const 將變量聲明為常量
從實用和編程的角度看,最重要的 C++ 常量類型是在變量類型前使用關(guān)鍵字 const 聲明的。通用的聲明方式類似于下面這樣:
const type variable = value;
或者
type const variable = value;
兩者是等價的,即 const int a = 1 和 int const a = 1 等價。
代碼示例:
#include <iostream>
using namespace std;int main()
{const int LENGTH = 10;const int WIDTH = 5;const char NEWLINE = '\n';int area; area = LENGTH * WIDTH;cout << "area is " << area << endl;cout << "newline " << NEWLINE;return 0;
}
3. 使用 constexpr 定義常量表達式
在 C++11 中 , 要求 constexpr 函 數(shù) 體 只 能 包 含 一 條 return語句。
通過關(guān)鍵字 constexpr ,可讓常量聲明像函數(shù):
constexpr double GetPi() {return 22.0 / 7;}
在一個常量表達式中,可使用另一個常量表達式:
constexpr double TwicePi() {return 2 * GetPi();}
使用示例:
#include <iostream>
using namespace std;constexpr double GetPI() { return 22.0/7; }
constexpr double TwicePI() { return 2 * GetPI(); }int main()
{const double PI = 22.0/7;cout << "PI is " << PI << endl;cout << "constexpr GetPI is " << GetPI() << endl;cout << "constexpr TwicePI is " << TwicePI() << endl;return 0;
}
GetPI() 和 TwicePI() 看起來像函數(shù),但其實不是函數(shù)。函數(shù)在程序執(zhí)行期間被調(diào)用,但 GetPI() 和 TwicePI() 是函數(shù)表達式,編譯器將每個 GetPI() 都替換成了3.14286,并將每個 TwicePI() 都替換成了6.28571。通過在編譯階段對 TwicePI() 進行解析,程序的執(zhí)行速度比將這些計算放在函數(shù)中時更快。
4. 使用關(guān)鍵字 enum 聲明的枚舉常量
枚舉類型( enumeration )是 C++ 中的一種派生數(shù)據(jù)類型,它是由用戶定義的若干枚舉常量的集合。
如果一個變量只有幾種可能的值,可以定義為枚舉( enumeration )類型。所謂"枚舉"是指將變量的值一一列舉出來,變量的值只能在列舉出來的值的范圍內(nèi)。
創(chuàng)建枚舉,需要使用關(guān)鍵字 enum 。枚舉類型的一般形式為:
enum 枚舉名{ 標(biāo)識符[=整型常數(shù)], 標(biāo)識符[=整型常數(shù)],
... 標(biāo)識符[=整型常數(shù)]
} 枚舉變量;
如果枚舉沒有初始化, 即省掉"=整型常數(shù)"時,則從第一個標(biāo)識符開始。
例如,下面的代碼定義了一個顏色枚舉,變量 c 的類型為 color。最后,c 被賦值為 “blue”。
enum color { red, green, blue
} c;
c = blue;
默認情況下,第一個名稱的值為 0,第二個名稱的值為 1,第三個名稱的值為 2,以此類推。但是,您也可以給名稱賦予一個特殊的值,只需要添加一個初始值即可。例如,在下面的枚舉中,green 的值為 5。
enum color { red, green=5, blue
};
在這里,blue 的值為 6,因為默認情況下,每個名稱都會比它前面一個名稱大 1,但 red 的值依然為 0。
#include <iostream>using namespace std;enum days
{Mon,Tue,Wed,Thu,Fri,Sat,Sun,
} day;int main()
{day = Sun;if (day == Sun){cout << "a is sunday" << endl;}return 0;
}
或者
#include <iostream>using namespace std;enum days
{Mon,Tue,Wed,Thu,Fri,Sat,Sun,
} day;int main()
{enum days today = Mon; // 聲明新的枚舉變量if (today == Mon){cout << "a is Monday" << endl;}return 0;
}
5. 使用 #define 定義常量
首先,也是最重要的是,編寫新程序時,不要使用這種常量。這里介紹使用 #define 定義常量,只是為了幫助您理解一些舊程序,它們使用下面的語法定義常量:
#define pi 3.14286
#define 是一個預(yù)處理器宏,讓預(yù)處理器將隨后出現(xiàn)的所有 pi 都替換為3.14286。預(yù)處理器將進行文本替換,而不是智能替換。編譯器既不知道也不關(guān)心常量的類型。
注意:使用 #define 定義常量的做法已被廢棄,因此不應(yīng)采用這種做法。
總結(jié)
以上是生活随笔為你收集整理的C++ 笔记(07)— 常量(字面常量、const定义常量、constexpr 定义常量、enum 定义常量、define 定义常量)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1978邵氏版《倚天屠龙记》电影的片头曲
- 下一篇: 签名2017个性网