C++基礎語法
基礎語法
第一個程序
#include <iostream>
using namespace std;
int main()
{
cout << "Hello world" <<endl;
return 0;
}
#include <iostream>
包含了一個iostream的文件頭。頭文件作為一種包含功能函數、數據接口聲明的載體文件,通常編譯器通過頭文件找到對應的函數庫,把引用的函數實際內容導出來。
<>
引起來代表導入的是標准庫的頭文件,而使用""
引起來的則是導入用戶自定義的頭文件。
using namespace std;
使用std命名空間。
return 0;
終止 main ( ) 函數,並向調用進程返回值 0。
注釋
作用:在代碼中加一些說明和解釋,方便自己或其他程序員程序員閱讀代碼
兩種格式
- 單行注釋:
// 描述信息
- 通常放在一行代碼的上方,或者一條語句的末尾,對該行代碼說明
- 多行注釋:
/* 描述信息 */
- 通常放在一段代碼的上方,對該段代碼做整體說明
提示:編譯器在編譯代碼時,會忽略注釋的內容
快捷鍵:
Ctrl+K → 選定需要注釋的代碼段 →Ctrl+C
取消注釋:
Ctrl+K → 選定需要取消注釋的代碼段 →Ctrl+U
變量
作用:給一段指定的內存空間起名,方便操作這段內存
語法:數據類型 變量名 = 初始值;
int main()
{
int a = 10;
cout << a << endl;
}
常量
作用:用於記錄程序中不可更改的數據
C++定義常量兩種方式
-
#define 宏常量:
#define 常量名 常量值
- 通常在文件上方定義,表示一個常量
-
const修飾的變量
const 數據類型 常量名 = 常量值
- 通常在變量定義前加關鍵字const,修飾該變量為常量,不可修改。
define 宏常量:
#include <iostream>
using namespace std;
#define day 7//注意這里沒分號
int main()
{
cout << "一周里總共有 " << day << " 天" << endl;
}
const修飾變量:
int main()
{
const int day = 7;
cout << "一周里總共有 " << day << " 天" << endl;
}
關鍵字
作用:關鍵字是C++中預先保留的單詞(標識符)
- 在定義變量或者常量時候,不要用關鍵字
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++得關鍵字,否則會產生歧義。
標識符命名規則
作用:C++規定給標識符(變量、常量)命名時,有一套自己的規則
- 標識符不能是關鍵字
- 標識符只能由字母、數字、下划線組成
- 第一個字符必須為字母或下划線
- 標識符中字母區分大小寫
數據類型
C++規定在創建一個變量或者常量時,必須要指定出相應的數據類型,否則無法給變量分配內存
整形
作用:整型變量表示的是整數類型的數據
C++中能夠表示整型的類型有以下幾種方式,區別在於所占內存空間不同:
數據類型 | 占用空間 | 取值范圍 |
---|---|---|
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) |
sizeof關鍵字
作用:利用sizeof關鍵字可以統計數據類型所占內存大小
語法: sizeof( 數據類型 / 變量)
nt main()
{
int a = 10;
long b = 20;
char c = 'a';
cout << "a:" << sizeof(a) << endl;
cout << "b:" << sizeof(b) << endl;
cout << "c:" << sizeof(c) << endl;
}
結果:
a:4b:4c:1
實型(浮點型)
作用:用於表示小數
浮點型變量分為兩種:
- 單精度float
- 雙精度double
兩者的區別在於表示的有效數字范圍不同。
數據類型 | 占用空間 | 有效數字范圍 |
---|---|---|
float | 4字節 | 7位有效數字 |
double | 8字節 | 15~16位有效數字 |
int main(){ float f1 = 3.14f; double f2 = 3.14; cout << sizeof(f1)<<":" << f1 << endl; cout << sizeof(f2) << ":" << f2 << endl; float f3 = 3e-2; // 3 * 0.1 ^ 2 cout << "f3 = " << f3 << endl;}
結果:
4:3.148:3.14f3 = 0.03
字符型
作用:字符型變量用於顯示單個字符
語法char ch = 'a';
注意1:在顯示字符型變量時,用單引號將字符括起來,不要用雙引號
注意2:單引號內只能有一個字符,不可以是字符串
C和C++中字符型變量只占用1個字節。
int main(){ char ch = 'a'; cout << ch << endl; cout << sizeof(char) << endl; cout << (int)ch << endl; //查看字符a對應的ASCII碼 ch = 97; //可以直接用ASCII給字符型變量賦值 cout << ch << endl; return 0;}
結果:
a197a
轉義字符
`
轉義字符 | 含義 | ASCII碼值(十進制) |
---|---|---|
\a | 警報 | 007 |
\b | 退格(BS) ,將當前位置移到前一列 | 008 |
\f | 換頁(FF),將當前位置移到下頁開頭 | 012 |
\n | 換行(LF) ,將當前位置移到下一行開頭 | 010 |
\r | 回車(CR) ,將當前位置移到本行開頭 | 013 |
\t | 水平制表(HT) (跳到下一個TAB位置) | 009 |
\v | 垂直制表(VT) | 011 |
\\ | 代表一個反斜線字符"" | 092 |
' | 代表一個單引號(撇號)字符 | 039 |
" | 代表一個雙引號字符 | 034 |
? | 代表一個問號 | 063 |
\0 | 數字0 | 000 |
\ddd | 8進制轉義字符,d范圍0~7 | 3位8進制 |
\xhh | 16進制轉義字符,h范圍09,af,A~F | 3位16進制 |
字符串型
作用:用於表示一串字符
兩種風格
int main(){ char str1[] = "hello wordld"; cout << str1 << endl; //c語言風格 string str2 = "hello wordld"; //c++風格 cout << str2 << endl; return 0;}
C++風格字符串,需要加入頭文件#include<string>
布爾類型 bool
int main() { bool flag = true; cout << flag << endl; // 1 flag = false; cout << flag << endl; // 0 cout << "size of bool = " << sizeof(bool) << endl; //1 return 0;}
數據的輸入
//整型輸入 int a = 0; cout << "請輸入整型變量:" << endl; cin >> a; cout << a << endl;
運算符
運算符類型 | 作用 |
---|---|
算術運算符 | 用於處理四則運算 |
賦值運算符 | 用於將表達式的值賦給變量 |
比較運算符 | 用於表達式的比較,並返回一個真值或假值 |
邏輯運算符 | 用於根據表達式的值返回真值或假值 |
算術運算符
運算符 | 術語 | 示例 | 結果 |
---|---|---|---|
+ | 正號 | +3 | 3 |
- | 負號 | -3 | -3 |
+ | 加 | 10 + 5 | 15 |
- | 減 | 10 - 5 | 5 |
* | 乘 | 10 * 5 | 50 |
/ | 除 | 10 / 5 | 2 |
% | 取模(取余) | 10 % 3 | 1 |
++ | 前置遞增 | a=2; b=++a; | a=3; b=3; |
++ | 后置遞增 | a=2; b=a++; | a=3; b=2; |
-- | 前置遞減 | a=2; b=--a; | a=1; b=1; |
-- | 后置遞減 | a=2; b=a--; | a=1; b=2; |
賦值運算符
運算符 | 術語 | 示例 | 結果 |
---|---|---|---|
= | 賦值 | a=2; b=3; | a=2; b=3; |
+= | 加等於 | a=0; a+=2; | a=2; |
-= | 減等於 | a=5; a-=3; | a=2; |
*= | 乘等於 | a=2; a*=2; | a=4; |
/= | 除等於 | a=4; a/=2; | a=2; |
%= | 模等於 | a=3; a%2; | a=1; |
比較運算符
運算符 | 術語 | 示例 | 結果 |
---|---|---|---|
== | 相等於 | 4 == 3 | 0 |
!= | 不等於 | 4 != 3 | 1 |
< | 小於 | 4 < 3 | 0 |
> | 大於 | 4 > 3 | 1 |
<= | 小於等於 | 4 <= 3 | 0 |
>= | 大於等於 | 4 >= 1 | 1 |
邏輯運算符
運算符 | 術語 | 示例 | 結果 |
---|---|---|---|
! | 非 | !a | 如果a為假,則!a為真; 如果a為真,則!a為假。 |
&& | 與 | a && b | 如果a和b都為真,則結果為真,否則為假。 |
|| | 或 | a || b | 如果a和b有一個為真,則結果為真,二者都為假時,結果為假。 |
選擇結構
if語句
單if
int score = 0; cout << "請輸入一個分數:" << endl; cin >> score;if (score > 600) { cout << "我考上了一本大學!!!" << endl; }
多if
多行格式if語句:if(條件){ 條件滿足執行的語句 }else{ 條件不滿足執行的語句 };
int main() { int score = 0; cout << "請輸入考試分數:" << endl; cin >> score; if (score > 600) { cout << "我考上了一本大學" << endl; } else { cout << "我未考上一本大學" << endl; } system("pause"); return 0;}
多條件的if語句:if(條件1){ 條件1滿足執行的語句 }else if(條件2){條件2滿足執行的語句}... else{ 都不滿足執行的語句}
int main() {int score = 0;cout << "請輸入考試分數:" << endl;cin >> score;if (score > 600){ cout << "我考上了一本大學" << endl;}else if (score > 500){ cout << "我考上了二本大學" << endl;}else if (score > 400){ cout << "我考上了三本大學" << endl;}else{ cout << "我未考上本科" << endl;}system("pause");return 0;}
三目運算符
作用: 通過三目運算符實現簡單的判斷
語法表達式1 ? 表達式2 :表達式3
解釋:
如果表達式1的值為真,執行表達式2,並返回表達式2的結果;
如果表達式1的值為假,執行表達式3,並返回表達式3的結果。
int a = 10; int b = 20; int c = 30; c = a ? a : b; cout << c << endl;
switch循環
switch(表達式){ case 結果1:執行語句;break; case 結果2:執行語句;break; ... default:執行語句;break;}
循環結構
while循環
while (num < 10) { cout << "num = " << num << endl; num++; }
在執行循環語句時候,程序必須提供跳出循環的出口,否則出現死循環
do while循環語句
語法: do{ 循環語句 } while(循環條件);
與while的區別在於do...while會先執行一次循環語句,再判斷循環條件
int main() { int num = 0; do { cout << num << endl; num++; } while (num < 10); system("pause"); return 0;}
for循環語句
語法: for(起始表達式;條件表達式;末尾循環體) { 循環語句; }
int main() { for (int i = 0; i < 10; i++) { cout << i << endl; } system("pause"); return 0;}
跳轉語句
break語句
break使用的時機:
- 出現在switch條件語句中,作用是終止case並跳出switch
- 出現在循環語句中,作用是跳出當前的循環語句
- 出現在嵌套循環中,跳出最近的內層循環語句
continue語句
作用:在循環語句中,跳過本次循環中余下尚未執行的語句,繼續執行下一次循環
goto語句
作用:可以無條件跳轉語句
語法: goto 標記;
解釋:如果標記的名稱存在,執行到goto語句時,會跳轉到標記的位置
cout << "1" << endl; goto FLAG; cout << "2" << endl; cout << "3" << endl; FLAG: cout << "4" << endl; cout << "5" << endl; cout << "6" << endl; cout << "7" << endl; cout << "8" << endl;
145678
數組
所謂數組,就是一個集合,里面存放了相同類型的數據元素
特點1:數組中的每個數據元素都是相同的數據類型
特點2:數組是由連續的內存位置組成的
定義方式:
數據類型 數組名[ 數組長度 ];
數據類型 數組名[ 數組長度 ] = { 值1,值2 ...};
數據類型 數組名[ ] = { 值1,值2 ...};
int main(){ int scores[10]; //利用下標賦值 scores[0] = 100; scores[1] = 99; scores[2] = 85; //利用下標輸出 cout << scores[0] << endl; cout << scores[1] << endl; cout << scores[2] << endl; return 0;}
數組名
- 可以統計整個數組在內存中的長度
- 可以獲取數組在內存中的首地址
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 }; cout << sizeof(arr)/ sizeof(arr[0]) << endl; //計算數組元素個數
通過數值名獲取數組內容中的首地址
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 }; cout << (int)arr << endl; cout << "數組中第一個元素地址為: " << (int)&arr[0] << endl; cout << "數組中第二個元素地址為: " << (int)&arr[1] << endl;
函數
作用:將一段經常使用的代碼封裝起來,減少重復代碼
一個較大的程序,一般分為若干個程序塊,每個模塊實現特定的功能。
函數的定義
函數的定義一般主要有5個步驟:
1、返回值類型
2、函數名
3、參數表列
4、函數體語句
5、return 表達式
語法:
返回值類型 函數名 (參數列表){ 函數體語句 return表達式}
- 返回值類型 :一個函數可以返回一個值。在函數定義中
- 函數名:給函數起個名稱
- 參數列表:使用該函數時,傳入的數據
- 函數體語句:花括號內的代碼,函數內需要執行的語句
- return表達式: 和返回值類型掛鈎,函數執行完后,返回相應的數據
int add(int num1, int num2) { return num1 + num2;}int main(){ int num = add(1, 2); cout << num << endl; return 0;}
值傳遞
- 所謂值傳遞,就是函數調用時實參將數值傳入給形參
- 值傳遞時,==如果形參發生,並不會影響實參
值傳遞時,形參是修飾不了實參的
函數的聲明
作用: 告訴編譯器函數名稱及如何調用函數。函數的實際主體可以單獨定義。
- 函數的聲明可以多次,但是函數的定義只能有一次
//聲明int max(int a, int b);int max(int a, int b);//定義int max(int a, int b){ return a > b ? a : b;}
函數的分文件編寫
作用:讓代碼結構更加清晰
函數分文件編寫一般有4個步驟
- 創建后綴名為.h的頭文件
- 創建后綴名為.cpp的源文件
- 在頭文件中寫函數的聲明
- 在源文件中寫函數的定義
// swap.h 內容#include <iostream>using namespace std;int add(int num1, int num2);//swap.cpp文件#include "swap.h"int add(int num1, int num2) { return num1 + num2;}//main #include <iostream>#include "swap.h"using namespace std;int main(){ int num = add(1, 1); cout << num << endl; return 0;}
指針
指針的作用: 可以通過指針間接訪問內存
- 內存編號是從0開始記錄的,一般用十六進制數字表示
- 可以利用指針變量保存地址
我們要取他的值是時候,或者要賦值的時候,要在指針前面加 * 號,而我要改變他的指向的時候是不加 * 號的。
不加 * 號 是對變量本身的操作,加了 * 號是對指針變量所指向位置的操作。
指針變量的定義和使用
指針變量定義語法: 數據類型 * 變量名;
int a=10; int * p; //聲明指針變量 p = &a;//指針指向變量a的地址 //指針使用 cout << &a << endl; //打印a地址 cout << p << endl;//打印指針變量 cout << "*p:" << *p << endl;
結果:
005AFE48005AFE48*p:10
指針變量和普通變量的區別
- 普通變量存放的是數據,指針變量存放的是地址
- 指針變量可以通過" * "操作符,操作指針變量指向的內存空間,這個過程稱為解引用
總結1: 我們可以通過 & 符號 獲取變量的地址
總結2:利用指針可以記錄地址
總結3:對指針變量解引用,可以操作指針指向的內存
總結4:所有指針類型在32位操作系統下是4個字節
空指針
int main() { //指針變量p指向內存地址編號為0的空間 int * p = NULL; //訪問空指針報錯 //內存編號0 ~255為系統占用內存,不允許用戶訪問 cout << *p << endl; system("pause"); return 0;}
野指針:指針變量指向非法的內存空間
int main{ int* p = (int*)0x100;cout << *p << endl;return 0; }
總結:空指針和野指針都不是我們申請的空間,因此不要訪問。
const修飾指針
const修飾指針有三種情況
- const修飾指針 --- 常量指針
- const修飾常量 --- 指針常量
- const 修飾指針,又修飾常量
int a = 10; int b = 10; //1. const修飾的是指針,指針指向可以改,指針指向的值不可以更改 const int* p1 = &a; //a取值給p1 p1 = &b; //b取值給p1 cout << p1 << endl; //*p1 = 100; 報錯 //2. const修飾的是常量,指針指向不可以改,指針指向的值可以更改 int* const p2 = &a; //p2 = &b; //錯誤 *p2 = 100; cout << *p2 << endl; //值等於100
看const右側緊跟着的是指針還是常量, 是指針就是常量指針,是常量就是指針常量。
常量指針:指針指向可以改,指針指向的值不可以更改
指針常量:指針指向不可以改,指針指向的值可以更改
const 修飾指針,又修飾常量:都不可更改。
指針和數組
作用:利用指針訪問數組中元素
int arr[] = { 1,2,3,4,5,6,7,8,9,10 }; int* p = arr;// //指向數組的指針 cout << *p << endl; for (int i = 0; i < 10; i++) { //利用指針遍歷數組 cout << *p << endl; p++;//偏移 }
指針和函數
作用:利用指針作函數參數,可以修改實參的值
void swap1(int a, int b){ int temp = a; a = b; b = temp;}int main(){ int a = 10; int b = 20; swap1(a, b); // 值傳遞不會改變實參 cout << "a = " << a << endl; cout << "b = " << b << endl; //結果:1=10,b= 20
實參未發生改變。
void swap2(int *p1, int *p2){ int temp = *p1; *p1 = *p2; *p2 = temp;}int main(){ int a = 10; int b = 20; swap2(&a,&b); // 值傳遞不會改變實參 cout << "a = " << a << endl; cout << "b = " << b << endl;}//結果:a= 20,b=10
總結:如果不想修改實參,就用值傳遞,如果想修改實參,就用地址傳遞。
結構體
結構體屬於用戶自定義的數據類型,允許用戶存儲不同的數據類型
通過結構體創建變量的方式有三種:
- struct 結構體名 變量名
- struct 結構體名 變量名 = { 成員1值 , 成員2值...}
- 定義結構體時順便創建變量
struct Person{ string name; int age; int score;};int main() { //方式一 Person person; person.name = "nice0e3"; person.age = 22; person.score = 10; cout << person.name << endl; cout << person.age << endl; cout << person.score << endl; //方式二 Person persion1 = { "nice0e3",22,10 }; cout << persion1.name << endl; cout << persion1.age << endl; cout << persion1.score << endl; return 0;}
總結1:定義結構體時的關鍵字是struct,不可省略
總結2:創建結構體變量時,關鍵字struct可以省略
總結3:結構體變量利用操作符 ''.'' 訪問成員
結構體數組
語法: struct 結構體名 數組名[元素個數] = { {} , {} , ... {} }
struct Person{ string name; int age; int score;};int main() { Person arr[3] = { {"張三",18,80 }, {"李四",19,60 }, {"王五",20,70 } }; for (int i = 0; i < sizeof(arr)/sizeof(arr[0]); i++) { cout << arr[i].name << "\n" << endl; cout << arr[i].age << "\n" << endl; cout << arr[i].score << "\n" << endl; }
構造體指針
作用:通過指針訪問結構體中的成員
- 利用操作符
->
可以通過結構體指針訪問結構體屬性
#include <iostream>#include "maincpp.h"using namespace std;struct Person{ string name; int age; int score;};int main() { struct Person person = { "張三",18,100}; Person * p = &person; cout << p->name << "\n" << endl; cout << p->age << "\n" << endl; cout << p->score << "\n" << endl;}
結構體做函數參數
作用:將結構體作為參數向函數中傳遞
傳遞方式有兩種:
- 值傳遞
- 地址傳遞
struct Person{ string name; int age; int score;};void printStudent(Person stu){ stu.age = 28; cout << "子函數中 姓名:" << stu.name << " 年齡: " << stu.age << " 分數:" << stu.score << endl;}//地址傳遞void printStudent2(Person* stu){ stu->age = 28; cout << "子函數中 姓名:" << stu->name << " 年齡: " << stu->age << " 分數:" << stu->score << endl;}int main() { struct Person person1 = { "張三",18,100}; struct Person person2 = { "李四",22,100}; printStudent(person1); printStudent2(&person2);}
如果不想修改主函數中的數據,用值傳遞,反之用地址傳遞
結構體中 const使用場景
作用:用const來防止誤操作
void printStudent2(const Person* stu){ //stu->age = 28; cout << "子函數中 姓名:" << stu->name << " 年齡: " << stu->age << " 分數:" << stu->score << endl;}int main() { struct Person person2 = { "李四",22,100}; printStudent2(&person2);}