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. 運算子
- 算術運算子:
+
-
*
/
%
++
(前後綴)--
(前後綴) - 賦值運算子:
=
+=
-=
*=
/=
%=
- 比較運算子:
==
!=
<
>
<=
>=
- 邏輯運算子:
!
&&
||
程式流程結構
C/C++支援最基本的三種程式執行結構:順序結構、選擇結構、迴圈結構
- 順序結構:程式按順序執行,不發生跳轉
- 選擇結構:依據條件是否滿足,有選擇的執行相應功能
- 迴圈結構:依據條件是否滿足,迴圈多次執行某段程式碼
1. 選擇結構
-
if else
: 包括多層巢狀 -
三目運算子:
表示式1 ? 表示式2 : 表示式3
-
switch
語句
2. 迴圈結構
while
迴圈do ... while
迴圈for
迴圈
3. 跳轉語句
break
語句,跳出當前迴圈或選擇結構continue
語句,在迴圈語句中,跳過本次迴圈中餘下尚未執行的語句,繼續執行下一次迴圈goto
語句,跳轉至標號出執行,不建議使用
陣列
1. 一維陣列
一維陣列定義的三種方式:
資料型別 陣列名[ 陣列長度 ];
資料型別 陣列名[ 陣列長度 ] = { 值1,值2 ...};
資料型別 陣列名[ ] = { 值1,值2 ...};
2. 二位陣列(多維陣列)
二維陣列定義的四種方式:
資料型別 陣列名[ 行數 ][ 列數 ];
資料型別 陣列名[ 行數 ][ 列數 ] = { {資料1,資料2 } ,{資料3,資料4 } };
資料型別 陣列名[ 行數 ][ 列數 ] = { 資料1,資料2,資料3,資料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修飾指標有三種情況:
- const修飾指標 --- 常量指標
- const修飾常量 --- 指標常量
- 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;}