賦值和運算#
| 進制 | 表達方式 | 例子 |
|---|---|---|
| 二進制 | 0b + 二進制 + 後綴 | |
| 八進制 | 0 + 八進制數 + 後綴 | |
| 十進制 | 十進制數 + 後綴 | |
| 十六進制 | 0x + 十六進制數 + 後綴 | |
後綴:
L/l:表示long型LL/ll:表示long long型U/u:表示unsigned型
類型轉換#
順序:
long doubledoublefloatunsigned long longlong longunsigned longlongunsigned intint
字符#
字符數據類型
| 類型 | 內存占用 | 說明 | 示例 |
|---|---|---|---|
| char | 1 | Ascii 字符 | |
| wchart_t | 2/4 | 寬字節字符 | wchar_t wcharA{L'A'}; |
| char16_t | 2 | utf_16 字符 | char16_t wchar16{u'A'}; |
| char32_t | 4 | utf_32 字符 | char32_t wchar32{U'A'}; |
類型推斷#
// a變量的類型是float
auto a{1.0f}
// 可以使用typeid(a).name()輸出來來查看
格式化輸出#
| 方法 | 說明 |
|---|---|
| std::fixed | 以小數點模式輸出浮點數 |
| std::scientific | 以科學計數法輸出小數 |
| std::defaultfloat | 恢復默認小數輸出 |
| std::setprecision(int) | 設置小數精度 |
| std::dec | 十進制輸出數字 |
| std::hex | 十六進制輸出數字 |
| std::oct | 八進制輸出數字 |
| std::showbase | 十六進制和八進制顯示前綴 |
| std::shownobase | 十六進制和八進制不顯示前綴 |
| std::setw(int) | 把輸出內容設置成指定寬度輸出 |
| std::setfill(char) | 當顯示寬度查過字符寬度時,用指定的字符串填充剩余內容 |
| std::left | 設置字符左對齊 |
| std::right | 設置字符右對齊 |
其中紅色方法需要引入頭文件iomanip
轉義#
運算優先級#
| 運算符 | 相關性 |
|---|---|
| () [] -> . 後綴 ++ 後綴 -- typeid const_cast dynamic_cast static_cast reinterpret_cast | 表達式從左往右 |
| ! ~ 一元 + 一元 -- 前綴 ++ 前綴 -- & * (類型) sizeof new new [] delete delete [] | 表達式從左往右 |
| .* 0>* | 表達式從右往左 |
| * / % | 表達式從左往右 |
| + - | 表達式從左往右 |
| << >> | 表達式從左往右 |
| < <= > >= | 表達式從左往右 |
| == != | 表達式從左往右 |
| & | 表達式從左往右 |
| ^ | 表達式從左往右 |
| | | 表達式從左往右 |
| && | 表達式從左往右 |
| || | 表達式從左往右 |
| ? : op= | 表達式從右往左 |
| throw | 表達式從右往左 |
| . | 表達式從左往右 |
字符編碼#
枚舉#
代碼示例:
// 基本類型只能是整形 int short
enum class 類型名稱:基本類型
{
類型1
}
// 基本類型寫默認是int
// 不賦值默認是從0開始
enum class EquipLv {
normal,
high,
rare,
epic,
legend,
myth
};
enum class EquipLv {
normal=100,
high,
rare,
epic,
legend,
myth=1000
};
// 使用
EquipLv weaponeCLV{ EquipLv::normal };
EquipLv weaponeDLV{ EquipLv::legend };
枚舉類型總結:
- 枚舉類型可以提高代碼的可讀性和安全性。
- 枚舉類型默認是 int 類型。
- 枚舉類型的成員只能是整數類型。
- 枚舉類型和其他類型轉換需要強制轉換。
- 默認情況下,枚舉類型的下一項的初始值是上一項的初始值 + 1。
自定義類型名稱#
給類型名稱改名的方式:(TypeName 被替換為 A)
#define TypeName Atypedef TypeName Ausing A = Typename
命名空間#
using namespace
變量生命週期#
- 代碼塊中的變量的生命從聲明開始,直到這個代碼塊結束。
- 聲明在代碼開始前的變量叫做全局變量,全局變量的生命是從程序運行開始的,一直到程序結束。
- 在變量名衝突的分情況下,采用就近原則
- 要訪問名稱衝突的全局變量,可以使用限定符::來訪問
自定義數據類型#
- 結構體的本質是按照我們自己的方式定義一塊連續的內存結構
- 聲明一個結構體變量的本質是像計算機申請一塊內存,而這塊內存的大小至少是我們定義的結構成員需要占用的內存之和(內存對齊)
- 使用結構體則是按照我們定義好的方式從這塊內存讀取和寫入數據。
位運算#
輸出二進制內容#
- 引入
bitset頭文件 std::bitset<需要顯示的二進制位數>(要顯示的變量)
#include<iostream>
#include<bitset>
int main() {
int a{(int) 0b11111101111111101111111 };
std::cout << std::bitset<32>(a);
return 0;
}
00000000011111101111111101111111
D:\project\cpp\demo1\Debug\demo1.exe (process 75568) exited with code 0.
Press any key to close this window . . .
左移#
<<
右移#
>>
帶符號的數右移的時候,最高位用符號位 補齊
取反#
~
與運算#
&
或運算#
|
異或運算#
^
關係運算符#
| 關係運算符 | 說明 |
|---|---|
| > | 大於 |
| < | 小於 |
| == | 等於 |
| >= | 大於等於 |
| <= | 小於等於 |
| != | 不等於 |
邏輯運算符號#
| 運算符 | 名稱 | 說明 |
|---|---|---|
| && | 邏輯與 | 1. 注意和位運算符 & 的區別 2. 操作數都為 true 的時候,表達式為 true |
| || | 邏輯與 | 1. 注意和位運算符 | 的區別 2. 操作數中有一個為 true,表達式為 true |
| ! | 邏輯非 | 1. 注意和位運算符~的區別 2. 操作數為 false 時 表達式為 true |
注意:
- 一元運算符的優先級高於二元運算符
- 位運算的優先級高於邏輯運算
- ~! > & > |
數值在邏輯運算中的本質是把數值轉換成 boolean 值,再進行邏輯運算
字符串處理#
字符串處理函數(cctype 頭文件)
| 函數 | 說明 |
|---|---|
| int isupper(char) | 判斷字符是否是大寫字母 |
| int islower(char) | 判斷字符是否為小寫字母 |
| int isalpha(char) | 判斷字符是否為字母 |
| int isdigit(char) | 判斷字符是否是數字 |
| int isalnum(char) | 判斷字符是否是字母或者數字 |
| int isspace(char) | 判斷字符是否是空白 |
| int isblank(char) | 判斷字符是否是空格 |
| int ispunct(char) | 判斷字符是否是標點符號 |
| int isprint(char) | 判斷字符是否是可打印字符 |
| int iscntrl(char) | 判斷字符是否是控制字符 |
| int isgraph(char) | 判斷字符是否是圖形個字符 |
| int tolower(char) | 將字符轉換為小寫 |
| int toupper(char) | 將字符轉換為大寫 |
語句塊的中變量#
C++17 新語法
if(變量生命; 條件)
{
}
else
{
}
格式化流輸出以及轉義#
printf
| 參數 | 說明 |
|---|---|
| d | 十進制數 |
| o | 八進制數 |
| u | 無符號十進制數 |
| x/X | 十六進制整數 |
| f | float 小數 |
| lf | double 小數 |
| s | 字符串 |
| 0 | 用 0 來補齊 |
| + | 替數字輸出 |
無顯示的輸入#
控制台不會顯示輸入的內容。
頭文件需要引入 <conio.h>
int _getch();
#include<iostream>
#include<conio.h>
int main() {
int a = _getch();
printf("輸入的字符是: %d", a);
return 0;
}
goto#
#include<iostream>
int main() {
char a;
rep:
printf("請輸入一個大寫字母: ");
std::cin >> a;
if (a > 64 && a < 91 )
{
a += 32;
}
else
{
goto rep;
}
return 0;
}
陣列本質#
- 一維陣列的本質是按照所申請的數據類型,向操作系統申請了一段連續的內存空間
- 多維陣列的本質也是向操作系統申請一塊連續的內存,一般來講是按照低維度有線排序的方式來排序(可能因為操作系統和編譯器的不同而不同)而索引只是為了方便訪問對應的區域
一維陣列#
定義方式:
數據類型名 陣列名[常量表達式];
初始化方式:
int a[10] = {0,1,2,3,4,5,6,7,8,9};
二維陣列#
定義方式:
數據類型名 陣列名[常量表達式1][常量表達式2];
初始化方式:
// 全部定義在大括號內
int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
// 可以省略一維長度
int a[][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
// 對部分元素賦值
int a[3][4] = {{1},{5},{9}};
基於陣列的循環#
#include<iostream>
int main() {
int a[4] = { 3, 4, 2, 7 };
// 第一種方式
for (int i = 0; i < sizeof(a) / sizeof(int); i++)
{
std::cout << a[i] << std::endl;
}
// 第二種方式
// 數據類型可以寫成auto
for(int value :a)
{
std::cout << value << std::endl;
}
return 0;
}
std::array#
原生陣列 + 額外功能
語法:
std::array<變量類型, 元素數量> 變量名
如:std::array<int, 5> studentId;
常見用法:
// 返回studentId的元素個數
studentId.size();
// 設置studentId中所有的元素為250
studentId.fill(250);
// 返回studentId[1]的內容,越界會報錯
studentId.at(1);
std::vector#
語法:
std::vector<數據類型> 變量名
如:
std::vector<int> studentId
常用方法:
// 初始化一個vector元素為1,2,3
std::vector<int> studentId{1,2,3};
// 設置這個vector擁有5個元素
std::vector<int> studentId(5);
// 設置這個vector擁有5個元素,並且初始化為100
std::vector<int> studentId(5, 100);
常用方法:
std::array中的方法 std::vector基本都可以使用
// 將值添加到vector中
studentId.push_back(值);
// 將studentId重新初始化擁有10個元素,每個元素為100
studentId.assign(10, 100);
// 將studentId清空
studentId.clear();
// 判斷studentId是否是空的
studentId.emtpty();
輸入#
C 語言#
char str[0xff];
scanf("%s", str);
wchar_t wstr[0xff];
wscanf(L"%s", wstr);
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
int main()
{
const char* username[10];
printf("請輸入您的名字:");
scanf("%s", &username);
printf("\n您的名字是: %s\n", username);
// 寬字符
setlocale(LC_ALL, "chs");
wchar_t* w_username = new wchar_t[5];
printf("【寬字符】請輸入您的名字:");
wscanf(L"%s", &username);
wprintf(L"\n【寬字符】您的名字是: %s\n", username);
return 0;
}
字符長度#
strlen()
寬字符求長度:
wslen()