文章目錄
- C++介紹
- 環境配置
- 第一個cpp程序
- 案例練習
- 變量
- 常量
- 關系運算符
- 邏輯運算符
- 條件運算符
- 位運算符
- 類型轉換
- 分支
- 循環
- 程序調用
- 綜合案例
C++介紹
-
基于C語言,繼承了C的所有語法;
-
靜態類型語言,需要先編譯,再執行;
-
貼近底層硬件,運行速度快;
? -
支持面向對象、面向泛型,增強版的C;
-
應用領域
-
編譯(Compile),編譯器 將整個源代碼翻譯成機器碼(二進制文件),一次性交給計算機執行,如C/C++;
-
解釋(Interpret),由解釋器將代碼逐行解釋為機器碼,交給計算機執行,如 python/js ;
-
c++的運行
-
版本C++ 98、C++ 11、 C++ 14、 C++ 17、C++ 20
環境配置
集成開發環境Visual Studio ,編輯、編譯;
下載地址
工具 -> 選項 可調整字體等
項目上右鍵 -> 設為啟動項目,做項目切換;
Ctrl + k, c 注釋;
Ctrl + k, u 取消注釋;
?
第一個cpp程序
#include <iostream> // 包含頭文件
using namespace std; // 使用std 命名空間/*多行注釋
int, 返回值類型
main,主函數
arr, 形式參數
{}, 函數體
*/
int main(char* arr[]) { //一個項目中僅僅一個main函數// cout 輸出 cin >> 變量 輸入// << 流輸出運算符// endl 結束一行cout << "Hello jack" << endl; // 必須分號結束// 系統調用system("pause"); // 暫停return 0;
}
選中源碼-右鍵-編譯,可以生成.obj目標文件;
選中項目-右鍵-生成(build),可以生成exe文件;
查看路徑如下:
?
案例練習
- 基于函數封裝實現功能;
- 輸入用戶名,輸出歡迎信息;
#include <iostream> // 包含頭文件
using namespace std; // 使用std 命名空間// 函數封裝 void 表示 函數沒有返回值
void welcomeUser() {cout << "請輸入用戶名:" << endl;// C++ 支持字符串類型 而C不支持string name;// 輸入cin >> name;// 輸出歡迎信息cout << "Welcome " << name << endl;
}int main(char* arr[]) {// 調用函數welcomeUser();// 系統調用system("pause"); // 暫停return 0;
}
也可以將該函數定義在另一個源文件中,本源文件內僅僅聲明即可使用。聲明如void welcomeUser(); 是沒有函數體的;編譯器會自動查找。
?
變量
- 聲明變量,即分配內存;
- 命名以字母、數字、下劃線,不以數字開頭;
- 在代碼塊{ }內部的變量為局部變量;在所有{}外的變量為全局變量;
- 局部變量必須先初始化賦值,才可以使用;而全局變量默認初始化;
- 代碼塊內部,優先查找(作用域最小的)局部變量,使用 :: + 變量 訪問全局變量;
#include <iostream> // 包含頭文件
using namespace std; // 使用std 命名空間// 定義枚舉類型
enum Sex
{MALE, // 默認從0開始FEMALE
};int main(char* arr[]) {// 整型定義int age; // 變量的聲明age = 23; // 初始化賦值// double double score = 79.534; // 聲明并賦值 為變量定義float scoreF = 60.8f;// 字符串定義string name = "jack";string fullName = name + "li"; // 字符串的拼接// 布爾bool isGood = false;// 枚舉enum Sex sex = MALE; // 定義 并賦值// 輸出cout << "姓名:" << name << endl;cout << "全名:" << fullName << endl;cout << "性別:" << sex << endl;cout << "年齡:" << age << endl;cout << "分數:" << score << endl;cout << "是否好學生:" << isGood << endl;// 系統調用system("pause"); // 暫停return 0;
}
- 變量基本類型(本質占用多少內存空間)
- char, 字符類型 單引號+單字符;1byte;對應ASCII碼整數值;
- short,短整型 2bytes
- int ,整型 2-4bytes,注意數據溢出,超出范圍循環到另一端;一般使用int;
- long,4bytes
- long long 8bytes
- unsigned short/int/long/long long 無符號(非負);
- unsigned char 無符號的字符
- float,單精度浮點型 4bytes
- double 雙精度,8bytes
- string,字符串
- bool,true/false,本質為整型
- void 空類型;
- 整數字面量默認為int; 可以后綴指定 LL 長整型/ ULL無符號長整型
- 小數字面量默認為double; 指定后綴 f -> float,L -> long double;
- 字符串的字面量是字符的數組;
?
- 自定義類型
- enum,枚舉
- struct,結構體
- union,共用體
- sizeof 查看占用內存大小
- sizeof age
?
- sizeof age
常量
- const 類型 常量名=賦值;值不可更改;
- #define ABC 5 宏定義常量;
- 常量值不可更改
?
關系運算符
- <、<=、 >、>= 優先;
- ==、!= 次之
- 表達式返回bool類型
邏輯運算符
&& 同true 則為true ,第一個為false,則不再計算第二個條件;
|| 有一個true 則返回true ,第一個為true,則不再計算第二個條件;
!取反
優先級
條件運算符
- 表達式 ?值1 :值2
- 表達式為true,則取值1;否則取值2;
- 優先級較低,一般使用()包裹;
位運算符
- ~ 按位取反;
- << 按位左移、>> 按位右移; 如 int a = 5; a << 2; 一般無符號的數左移、右移;
- & 按位與,同1則為1;
- | 按位或,有1則為1;
- ^ 按位異或,相同則為0,不同則為1;
- 優先級從上到下依次降低;
類型轉換
- 隱式轉換,
- 短的數據類型向長的數據類型轉換;如int -> long long; 4 + 5.5 這里4轉為double
- short/char/bool 一般會轉為int;
- 判斷時,0轉為false,非0轉為true;
- 賦值時,右側值類型轉為左側變量的類型;
- 強制轉換,長的類型向短的類型中轉換;
- int age = 5;
- double aa =(double)age; // C風格
- double bb = double(age); // C++風格
- static_cast<double>(age)
分支
- if …else
if (表達式) {}if (表達式) {}
else if (表達式) {}
else {}
- switch
int age = 5;
switch(age){ // 必須傳入數值case 1: 語句;break;case 2: 語句;brea;default: 語句;
}
案例1:輸入一個人的姓名,分數,輸出他的平分等級;
>=90 優秀;
>=80 良好;
>=70中等;
>=60及格;
否則,不及格
#include <iostream>using namespace std;int main() {// declarestring name;double score;cout << "輸入姓名:" << endl; // endl換行//獲取輸入cin >> name;cout << "輸入分數:" << endl;cin >> score;// 判斷if (score >= 90) {cout << name << ":優秀" << endl;}else if (score >= 80) {cout << name << ":良好" << endl;}else if (score >= 70) {cout << name << ":中等" << endl;}else if (score >= 60) {cout << name << ":及格" << endl;}else {cout << name << ":不及格" << endl;}// system("dir");system("pause");return 0;
}
?
案例2: 輸入績效等級,輸出獎金數額;
使用switch
#include <iostream>using namespace std;int main() {// declarechar level;cout << "輸入等級:" << endl;cin >> level;switch (level) { // 傳入數值case 'A': cout << 1000 << endl; break;case 'B': cout << 500 << endl; break;case 'C': cout << 300 << endl; break;default: cout << "沒有獎勵" << endl;}// system("dir");system("pause");return 0;
}
?
循環
- while
- do…while
- for
C是面向過程,為擴展C的功能,開發出了C++,擴展了面向對象、基于泛型的操作;
C的所有語法在C++中基本都可以使用;
由于C++的復雜性,基于C++ 實現了java語言,在保留好用的語法的同時,進行了不好的語法的修改;
?
while循環:
#include <iostream>using namespace std;int main() {// declarechar level;int i = 3;// 用戶循環輸入while (1) {// 異常捕獲try{cout << "輸入等級:" << endl;cin >> level;switch (level) {case 'A': cout << 1000 << endl; break;case 'B': cout << 500 << endl; break;case 'C': cout << 300 << endl; break;default: cout << "沒有獎勵" << endl;}--i;cout << "i:" << 5 / i << endl; // 除0會退出進程continue; // 繼續下次循環}catch (const std::exception&) // 異常捕獲 與java js類似{cout << "捕獲異常" << endl;break; // 結束循環}}// system("dir");system("pause");return 0;
}
?
do…while:
int i = 10;
do {cout << "current i:" << i << endl;--i;
}while(i > 0);
?
for循環:
// C 的用法
int i;
for(i=0; i < 10; i++){ // 滿足i<10,則執行代碼塊,最后執行i++,再判斷是否滿足條件cout << "current i:" << i << endl;
}// 遍歷數組元素 同java
int arr[] = {1, 2, 5, 9};
for (int e : arr) {if (e % 5 == 0) {continue; // 繼續下次循環,后面的代碼不再執行}else if(e / 3 == 3){break; // 結束循環}elsecout << e << endl;
}
// 最終輸出 1 2
 ;
goto 標簽: 跳轉到語句塊,不推薦使用
#include <iostream>
using namespace std;int main() {goto laufing; // 語句塊 跳轉 windows批處理支持goto// 聲明語句塊
laufing: cout << "input your name:" << endl;string name;cin >> name; // 直接輸入空格,不會停止掃描,輸入字符串后遇到空格則停止// name.empty() 是否為空// name.length() 長度// name.at(idx) 獲取對應索引處的字符// name.substr(start_idx, count) 從idx索引開始,截取count個字符// name.find(sub_string) 返回找到的第一個位置的索引,找不到則返回一個很大的數字// name.rfind(sub_string) 從右邊開始查找,返回第一個的起始索引// name.clear() 清空該地址的字符串if (name.empty()) { // 字符串為空cout << "empty name" << endl;goto laufing;}else if (name.length() < 2) {cout << "to short" << endl;goto laufing;}else{cout << "idx 0:" << name.at(0) << endl;cout << "substr:" << name.substr(1, 3) << endl;cout << "find:" << name.find("ja") << endl;cout << "find:" << name.rfind("ja") << endl;name.clear();cout << "clear:" << name << endl;}// system("dir");system("pause");return 0;
}
?
程序調用
- 源代碼打斷點,直接在對應的行處點擊;再次點擊取消斷點
- 調試快捷鍵
- F5 開始調試,shift+F5 結束調試,Ctrl+F5 直接執行(不調試)
- F11 逐行執行,shift+F11 到下一個斷點;
- shift+F9 快速監視變量值,選中一個變量->shift+F9,點擊‘添加監視’
- 也可以點擊菜單欄的‘調試’;
?
綜合案例
- 輸入一個自然數 n,判斷是否為質數;
- 只能被1和自身整除,則為質數;
- 1和自身 不用判斷,可以取 2 -> n / 2 之間的值,依次判斷是否被n整除;
- n特別大時,為優化性能,可以取 2 - > sqrt(n)之間的值來判斷;
#include <iostream>
using namespace std;// bool是函數返回值類型
// n是函數的形式參數
bool isPrimer(int n){ //定義一個函數int i = 2;int upperVal = n / 2;// 標志位bool flag = true;while (i <= upperVal) {if(n % i == 0){flag = false;break;}++i;}if (flag) {cout << n << "是質數" << endl;return 1;}else {cout << n << "不是質數" << endl;return 0;}
}int main() {int n;cout << "input a value:" << endl;cin >> n;isPrimer(n);// system("dir");system("pause");return 0;
}
- 輸入一個自然數n,輸出n以內的所有質數;
int i;
for(i=2; i <= n/2; i++){if(isPrimer(i))cout << i << endl; // 單行語句,可以省略 { }elsecontinue;
}
?
- 猜數字游戲
- 程序運行時,隨機設定一個目標數值;
- 讓用戶輸入一個數字,與目標數值比較;
- 大于目標值,則輸出‘大了’;
- 小于目標值,則輸出‘小了’;
- 等于目標值,則輸出“恭喜,猜對了”
int main() {//當前時間戳 秒int curTimestamp = time(0); // python中 time.time() 獲取時間戳 秒 // js: new Date().getTime() 毫秒// 設置隨機數種子// srand(10); 種子固定,則每次運行程序時,都產生同樣的隨機數,為了產生不同的隨機數// 需要設置隨機數的種子,即偽隨機 --不是真正的隨機srand(curTimestamp);//生成 100 內的隨機數int target = rand() % 100; // 1000以內就 %1000int guessTimes = 5;int curTimes = 1;int guessVal;while (curTimes <= guessTimes) {// 讓用戶輸入cout << "input your guess:" << endl;cin >> guessVal;if (guessVal < target) {cout << "小了" << endl;++curTimes;}else if (guessVal > target) {cout << "大了" << endl;++curTimes;}else {cout << "恭喜,猜對了" << endl;break;}}if (curTimes > guessTimes) {cout << "game over" << endl;}// system("dir");system("pause");return 0;
}
?
?
下一篇:C++ 教程 - 02 復合數據結構