基本資料型態和運算式
基本資料型態
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;
}
