基本資料型態和運算式
基本資料型態
C++支援基本資料型別
- 整數型別
- 浮點數型別
- 字符型別
- 布林型別
文字常數
- 在程序運行期間不可變的數據稱為常數。文字常數是直接使用符號表示的數據,例如:12,3.5,’A’都是常數。
變數
- 變數定義格式如下:
資料型別 變數名1 變數名2 ... 變數名n;
- C++中支援多種初始化方式,例如:
int a = 0; int a(0); int a = {0}; int a{0};
- 其中,使用大括號的初始化方式稱為列表初始化,且列表初始化時不允許丟失資訊。
- C++的基本資料型別不包括字串型別,C++標準庫中提供了string類。
符號常數(由const修飾的對象)
- 常數定義語法:
const 資料型別 常數名 = 常數值; 資料型別 const 常數名 = 常數值; constexpr 資料型別 常數名 = 常數表達式;
- 例如,我們可以定義一個代表圓周率的符號常數:
const float PI = 3.1415926; constexpr int size = get_size();
- 符號常數在定義時必須初始化,並且在程式中不能更改其值。
- 引入
constexpr
關鍵字會要求編譯器驗證初始值是否為常量運算式。
常數表達式
- 常數表達式是一種在編譯階段確定的表達式,其值在程序運行期間不會改變。例如:
const int max_size = 100; // max_size是常數表達式 const int limit = max_size + 1; // limit是常數表達式
基本資料型別
- 整數型別
- 基本整數型別:
int
:一般的整數型別signed
和unsigned
:有號數和無號數short
和long
:短整數和長整數
- 基本整數型別:
- 字符型別
- char型別:儲存單個字符的編碼
- 字串型別:
- C風格的字串:採用字符數組
- C++風格的字串:使用標準C++類庫中的
string
類
- 布林型別
- bool型別:只有兩個值
true
(真)和false
(假),常用來表示邏輯運算的結果。
- bool型別:只有兩個值
- 浮點數型別:
- 單精度:
float
- 雙精度:
double
- 擴展精度:
long double
- 單精度:
整數文字常數
- 整數文字常數可以以十進制、八進制或十六進制表示:
- 十進制:由數字0~9組成,但不能以0開頭。
- 八進制:以0開頭,後接若干0~7的數字。
- 十六進制:以
0x
或0X
開頭,後接數字09和字母AF(不區分大小寫)。
後綴可以用來指定數據型別,如
L
或LL
表示long
,U
表示unsigned
。
浮點數文字常數
- 浮點數文字常數可以用常規或指數形式表示:
- 常規形式:如
12.5
,-12.5
- 指數形式:如
0.345E+2
,-34.4E-3
- 常規形式:如
- 後綴
F
或f
可以使其成為float
型別。
sizeof 運算符
- 語法形式:
sizeof(型別名)
或sizeof 表達式
- 結果值為指定型別或表達式的結果型別所佔的字節數。
sizeof(short) sizeof x
字符文字常數
- 單引號括起來的單個字符,如:
'a'
,'D'
,'?'
,'$'
- C++轉義字符列表:
-
- \a:響鈴
- \n:換行
- \t:水平製表符
- \v:垂直製表符
- \b:退格
- \r:回車
- \f:換頁
- \:字符
\
- “:雙引號
- ‘:單引號
- ?:問號
C風格字串常數
- 一對雙引號括起來的字符序列。
- 字串在內存中的存放形式是:按字串中字符的順序存放,每個字符佔一個字節,並在末尾添加
'\0'
作為結尾標記。 - 通過添加前綴可以改變字符常數或字串常數的型別,前綴及其含義如下表所示:
- u:Unicode 16字符 (char16_t)
- U:Unicode 32字符 (char32_t)
- L:寬字符 (wchar_t)
- u8:UTF-8(僅用於字串字面常數) (char)
基本資料型別
- bool型別:1字節 (
false
,true
) - char型別:1字節(-128到127)
- signed char型別:1字節(-128到127)
- unsigned char型別:1字節(0到255)
- short型別:2字節(-32768到32767)
- unsigned short型別:2字節(0到65535)
- int型別:4字節(-2147483648到2147483647)
- unsigned int型別:4字節(0到4294967295)
- long型別:4字節(-2147483648到2147483647)
- unsigned long型別:4字節(0到4294967295)
- long long型別:8字節(-9223372036854775808到9223372036854775807)
- unsigned long long型別:8字節(0到18446744073709551615)
- float型別:4字節(絕對值範圍3.4×10^(-38)到3.4×10^38)
- double型別:8字節(絕對值範圍1.7×10^(-308)到1.7×10^308)
- long double型別:8字節(絕對值範圍1.7×10^(-308)到1.7×10^308)
ISO C++標準中的資料型別字節數和範圍順序
(signed/unsigned)signed char
≤(unsigned) short int
≤(unsigned) int
≤(unsigned) long int
≤long long int
型別別名
- 可為已有資料型別重新命名:
typedef double 面積 體積; typedef int 自然數; 自然數 i1, i2; 面積 a; 體積 v; using 新型別名 = 已有型別名; using 面積 = double; using 體積 = double;
auto型別與decltype型別
- auto型別:讓編譯器自動推斷變數的型別:
auto val = val1 + val2;
- decltype型別:用於定義與某一表達式型別相同但不想用該表達式初始化的變數:
decltype(i) j = 2;
算術運算符與算術表達式
- 基本算術運算符:
+
,-
,*
,/
(若整數相除,結果取整),%
(取餘,操作數為整數) - 優先級與結合性:先乘除,後加減,同級自左至右
- 自增、自減運算符:
++
,--
例:i++; --j;
賦值運算符與賦值表達式
- 簡單的賦值運算符:”=”
- 例:
n = n + 5
- 表達式的型別為賦值運算符左邊對象的型別
- 表達式的值為賦值運算符左邊對象被賦值後的值
- 例:
逗號運算與逗號表達式
- 格式:
表達式1,表達式2
- 求解順序及結果:先求解表達式1,再求解表達式2,最終結果為表達式2的值
- 例:
a = 3 * 5, a * 4
,最終結果為60
- 例:
關係運算與關係表達式
- 運算符:
<
,<=
,>
,>=
,==
,!=
- 優先級:
<
,<=
,>
,>=
(高)==
,!=
(低) - 結果型別:
bool
,值為true
或false
- 例:
a > b
,c <= a + b
,x + y == 3
- 例:
邏輯運算與邏輯表達式
- 邏輯運算符:
!(非)
,&&(與)
,||(或)
- 優先級:
!
>&&
>||
- 結果型別:
bool
,值為true
或false
- 例:
(a > b) && (x > y)
- 例:
條件運算符與條件表達式
- 一般形式:
表達式1?表達式2:表達式3
- 表達式1:必須是
bool
型別 - 執行順序:
- 先求解表達式1,若為
true
,則求解表達式2,否則求解表達式3 - 例:
x = a > b ? a : b;
- 先求解表達式1,若為
條件運算符的優先級
- 條件運算符優先級:高於賦值運算符,低於邏輯運算符
- 表達式2、3的型別:可以不同,條件表達式的最終型別為2和3中較高的型別。
運算式
位運算
- 按位與(&)
- 運算規則:將兩個運算量的每一位進行邏輯與操作
- 例:
3 & 5
- 用途:
- 將某一位置0,其他位不變。
- 取指定位。
- 按位或(|)
- 運算規則:將兩個運算量的每一位進行邏輯或操作
- 例:
3 | 5
- 用途:
- 將某些位置1,其他位不變。
- 按位異或(^)
- 運算規則:若對應位相同,則結果該位為0,若對應位不同,則結果該位為1
- 例:
071 ^ 052
- 用途:
- 使特定位翻轉
- 取反(~)
- 運算規則:單目運算符,對一個二進制數按位取反。
- 例:
~025
- 移位
- 左移運算(<<):左移後,低位補0,高位舍棄。
- 右移運算(>>):右移後,低位舍棄;無號數高位補0,有號數高位補“符號位”。
混合運算時資料型別的轉換
- 隱含轉換:
- 若有一個操作數是
long double
型,則將另一個操作數轉換為long double
型。 - 若無前述條件,且有一個操作數是
double
型,則將另一個操作數轉換為double
型。 - 若無前述條件,且有一個操作數是
float
型,則將另一個操作數轉換為float
型。 - 若無前述條件,且有一個操作數是
unsigned long long
型,則將另一個操作數轉換為unsigned long long
型。
- 若有一個操作數是
- 顯式轉換:
- 語法形式:
型別說明符(表達式)
,(型別說明符)表達式
,型別轉換操作符<型別說明符>(表達式)
- 型別轉換操作符:
const_cast
,dynamic_cast
,reinterpret_cast
,static_cast
- 例:
int(z)
,(int)z
,static_cast<int>(z)
三種形式等價
- 語法形式:
簡單的I/O格式控制
- 操縱符:
dec
:數值資料採用十進制表示hex
:數值資料採用十六進制表示oct
:數值資料採用八進制表示ws
:提取空白符endl
:插入換行符,並刷新流ends
:插入空字符setprecision(int)
:設定浮點數的小數位數setw(int)
:設定域寬- 例:
cout << setw(5) << setprecision(3) << 3.1415;
例2_2:輸入一個年份,判斷是否閏年
//2_2.cpp #include <iostream> using namespace std; int main() { int year; bool isLeapYear; cout << "Enter the year: "; cin >> year; isLeapYear = ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)); if (isLeapYear) cout << year << " is a leap year" << endl; else cout << year << " is not a leap year" << endl; return 0; }