1. 程式人生 > 其它 >Go 錯誤處理

Go 錯誤處理

教程筆記

C++中的基礎語法與C基本一樣,C++是包含C的所有語法的

C++概覽

1. 初識C++

Hello C++

#include <iostream>
using namespace std;

int main()
{
	cout << "Hello C++" << endl;

	system("pause");

	return 0;
}
  • c++中的關鍵字

    asm do if return typedef
    auto double inline short typeid
    bool dynamic_cast int signed typename
    break else long sizeof union
    case enum mutable static unsigned
    catch explicit namespace static_cast using
    char export new struct virtual
    class extern operator switch void
    const false private template volatile
    const_cast float protected this wchar_t
    continue for public throw while
    default friend register true
    delete goto reinterpret_cast try

    提示:在給變數或者常量起名稱時候,不要用C++得關鍵字,否則會產生歧義。

2. 資料型別

2.1 整型

資料型別 佔用空間 取值範圍
short(短整型) 2位元組 (-2^15 ~ 2^15-1)
int(整型) 4位元組 (-2^31 ~ 2^31-1)
long(長整形) Windows為4位元組,Linux為4位元組(32位),8位元組(64位) (-2^31 ~ 2^31-1)
long long(長長整形) 8位元組 (-2^63 ~ 2^63-1)

2.2 實型(浮點型)

資料型別 佔用空間 有效數字範圍
float 4位元組 7位有效數字
double 8位元組 15~16位有效數字

2.3 字元型

作用:字元型變數用於顯示單個字元

語法:char ch = 'a';

注意1:在顯示字元型變數時,用單引號將字元括起來,不要用雙引號

注意2:單引號內只能有一個字元,不可以是字串

2.4 字串型

作用:用於表示一串字元

  • C風格字串: char str[] = "stringValue"
  • C++風格字串: string str = "stringValue"

注意:C++風格字串,需要加入標頭檔案 #include < string >

2.5 布林型別

bool型別只有兩個值:

  • true ----真(本質是1)
  • false ----假(本質是0)

bool型別整1個位元組大小

3. 運算子

  1. 算術運算子:+ - * / % ++(前後綴) -- (前後綴)
  2. 賦值運算子: = += -= *= /= %=
  3. 比較運算子:== != < > <= >=
  4. 邏輯運算子:! && ||

程式流程結構

C/C++支援最基本的三種程式執行結構:順序結構、選擇結構、迴圈結構

  • 順序結構:程式按順序執行,不發生跳轉
  • 選擇結構:依據條件是否滿足,有選擇的執行相應功能
  • 迴圈結構:依據條件是否滿足,迴圈多次執行某段程式碼

1. 選擇結構

  1. if else : 包括多層巢狀

  2. 三目運算子: 表示式1 ? 表示式2 : 表示式3

  3. switch 語句

2. 迴圈結構

  1. while迴圈
  2. do ... while 迴圈
  3. for 迴圈

3. 跳轉語句

  1. break 語句,跳出當前迴圈或選擇結構
  2. continue 語句,在迴圈語句中,跳過本次迴圈中餘下尚未執行的語句,繼續執行下一次迴圈
  3. goto 語句,跳轉至標號出執行,不建議使用

陣列

1. 一維陣列

一維陣列定義的三種方式:

  1. 資料型別 陣列名[ 陣列長度 ];
  2. 資料型別 陣列名[ 陣列長度 ] = { 值1,值2 ...};
  3. 資料型別 陣列名[ ] = { 值1,值2 ...};

2. 二位陣列(多維陣列)

二維陣列定義的四種方式:

  1. 資料型別 陣列名[ 行數 ][ 列數 ];
  2. 資料型別 陣列名[ 行數 ][ 列數 ] = { {資料1,資料2 } ,{資料3,資料4 } };
  3. 資料型別 陣列名[ 行數 ][ 列數 ] = { 資料1,資料2,資料3,資料4};
  4. 資料型別 陣列名[ ][ 列數 ] = { 資料1,資料2,資料3,資料4};

函式

c++的函式和c的函式不同點

1.函式預設引數

在c++中,函式的形參列表中的形參可以有預設值

語法: 返回值型別 函式名 (引數 = 預設值) {}

示例:

int func(int a, int b = 10)
{
	return a * b;
}

int main()
{
	cout << "ret = " <<  func(10) << endl;
	cout << "ret = " << func(10,2) << endl;

	system("pause");

	return 0;
}

注意: 預設引數必須放在引數列表的最後,呼叫時預設引數不傳參使用預設的

傳入引數,使用傳入的實參

2. 函式佔位引數

c++中函式的形參列表裡可以有佔位引數,用來佔位,呼叫函式時必須填補該位置

語法: 返回值型別 函式名 (資料型別) {}

void func(int a, int)
{
    cout << "this is func" << endl;
}

int main()
{
    func(10, 10);  //佔位引數必須填補
    
    system("pause");

	return 0;
    
}

3. 函式過載

函式過載的條件:

  • 同一作用域下
  • 函式名稱相同
  • 函式引數型別 或者 個數不同 或者 順序不同

注意: 函式的返回值不可以作為函式過載的條件

示例:

void func()
{
	cout << "func()" << endl;
}

void func(int a)
{
	cout << "func(int a)" << endl;
}

void func(double a)
{
	cout << "func(double a)" << endl;
}

void func(int a, double b)
{
	cout << "func(int a, double b)" << endl;
}

void func(double b, int a)
{
	cout << "func(double a, int b)" << endl;
}

//函式返回值不可以作為函式過載條件
//int func(double b, int a)
//{
//	cout << "func(double a, int b)" << endl;
//
//	return 0;
//}

int main()
{
	func();
	func(10);
	func(3.14);
	func(10, 3.14);
	func(3.14, 10);

	system("pause");

	return 0;
}

函式過載碰到預設引數

void func(int a, int b = 10)
{
	cout << "func(int a, int b = 10)" << endl;
}

void func(int a)
{
	cout << "func(int a)" << endl;
}

int main()
{
	int a = 10;

	//func(a);	//錯誤,預設引數產生歧義

	system("pause");

	return 0;
}

指標

1. 基本概念

指標作用: 可以通過指標間接訪問記憶體

  • 記憶體編號從0開始記錄的,一般用十六進位制數字標識
  • 可以用指標變數儲存地址

2. 指定的定義

語法: 資料型別* 變數名

int main()
{
    int a = 10;
    int* p;
    
    p = &a;		//p指向變數a的地址
    
    cout << &a << endl;	//列印資料a的地址
    cout << p << endl;	//列印指標p的地址
    
    cout << "*p" << *p << endl; //通過*操作列印指標指向的地址的資料
    
    system("pause");
    
    return 0;    
}

說明:所有指標型別在32位作業系統下是4個位元組,在64位系統下是8個位元組

3. 空指標和野指標

空指標: 指標變數指向記憶體編號為0的空間

用途: 初始化指標變數

注意: 空指標指向的記憶體是不可以訪問的

示例:

int main()
{
    int* p = nullptr;
     
    cout << *P << endl;  //程式執行異常,空指標指向的記憶體地址是不允許使用者訪問
    
    system("pause");

	return 0;
}

野指標: 指標變數指向非法記憶體空間

示例:

int main()
{
	int* p = (int*)0x1100;
	
    //訪問野指標報錯
	cout << *p << endl;

	system("pause");

	return 0;
}

總結:空指標和野指標都不是我們申請的空間,因此不要訪問。

4. const修飾指標

const修飾指標有三種情況:

  1. const修飾指標 --- 常量指標
  2. const修飾常量 --- 指標常量
  3. const既修飾指標又修飾常量

示例:

int main(){	int a = 10;	int b = 10;	//const修飾的是指標,指標指向可以改,指標指向的值不可以更改	const int* p1 = &a;	p1 = &b;	//正確	//*p1 = 100;	//錯誤	//const修飾的是常量,指標指向不可以改,指標指向的值可以更改	int* const p2 = &a;	//p2 = &b;	//錯誤	*p2 = 100;	//正確	//const既修飾指標又修飾常量	const int* const p3 = &a;	//p3 = &b;	//錯誤	//*p3 = 100;	//錯誤	system("pause");	return 0;}

技巧: 看const右側跟著的是指標還是常量,是指標就是常量指標,是常量就是指標常量

5. 指標和陣列

利用指標訪問陣列中元素,陣列名就是陣列的首地址

int main(){	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };	int* p = arr;	cout << "第一個元素: " << arr[0] << endl;	cout << "指標訪問第一個元素:" << *p << endl;	for (int i = 0; i < 10; i++) {		//利用指標遍歷陣列		cout << *p << endl;		p++;	}	system("pause");	return 0;}

6. 指標作函式引數

傳入指標,可以修改實參的值

示例:

//值傳遞void swap1(int a, int b){	int temp = a;	a = b;	b = temp;}//地址傳遞void swap2(int* p1, int* p2){	int temp = *p1;	*p1 = *p2;	*p2 = temp;}int main(){	int a = 10;	int b = 20;	//值傳遞,不會改變實參	swap1(a, b);	cout << "a = " << a << endl;	cout << "b = " << b << endl;	//地址傳遞,會改變實參	swap2(&a, &b);	cout << "a = " << a << endl;	cout << "b = " << b << endl;	system("pause");	return 0;}