賦值和運算#
進制 | 表達方式 | 例子 |
---|---|---|
二進制 | 0b + 二進制 + 後綴 | |
八進制 | 0 + 八進制數 + 後綴 | |
十進制 | 十進制數 + 後綴 | |
十六進制 | 0x + 十六進制數 + 後綴 | |
後綴:
L/l
:表示long
型LL/ll
:表示long long
型U/u
:表示unsigned
型
類型轉換#
順序:
long double
double
float
unsigned long long
long long
unsigned long
long
unsigned int
int
字符#
字符數據類型
類型 | 內存佔用 | 說明 | 示例 |
---|---|---|---|
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 A
typedef TypeName A
using 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()