banner
Psycho

Psycho

#psycho

C++基礎知識

賦值和運算#

進制表達方式例子
二進制0b + 二進制 + 後綴
八進制0 + 八進制數 + 後綴
十進制十進制數 + 後綴
十六進制0x + 十六進制數 + 後綴

後綴

  • L/l:表示long
  • LL/ll:表示long long
  • U/u:表示 unsigned

類型轉換#

順序:

  1. long double
  2. double
  3. float
  4. unsigned long long
  5. long long
  6. unsigned long
  7. long
  8. unsigned int
  9. int

字符#

字符數據類型

類型內存佔用說明示例
char1Ascii 字符
wchart_t2/4寬字節字符wchar_t wcharA{L'A'};
char16_t2utf_16 字符char16_t wchar16{u'A'};
char32_t4utf_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)

  1. #define TypeName A
  2. typedef TypeName A
  3. using A = Typename

命名空間#

using namespace

變量生命週期#

  • 代碼塊中的變量的生命從聲明開始,直到這個代碼塊結束。
  • 聲明在代碼開始前的變量叫做全局變量,全局變量的生命是從程序運行開始的,一直到程序結束。
  • 在變量名衝突的分情況下,采用就近原則
  • 要訪問名稱衝突的全局變量,可以使用限定符::來訪問

自定義數據類型#

  • 結構體的本質是按照我們自己的方式定義一塊連續的內存結構
  • 聲明一個結構體變量的本質是像計算機申請一塊內存,而這塊內存的大小至少是我們定義的結構成員需要佔用的內存之和(內存對齊)
  • 使用結構體則是按照我們定義好的方式從這塊內存讀取和寫入數據。

位運算#

輸出二進制內容#

  1. 引入bitset頭文件
  2. 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十六進制整數
ffloat 小數
lfdouble 小數
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()

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。