系列文章目录
前言
该系列文章作为学习C++的记录,由浅入深,若文章中出现错误请指正。
提示:以下是本篇文章正文内容,下面案例可供参考
重点掌握内容
- C++初识
- 数据类型
- 运算符
- 程序流程结构
- 数组
- 函数
- 指针
- 结构体
一、C++初识?
1、第一个C++程序
注意:这里以vs2019做演示
打开vs程序看到以下界面,点击创建新项目,进入新页面选择空项目,点击下一步,配置新项目,为项目命名并选择包存放的地址(最好将包存放在一个专属的位置,以后都在此存储),点击创建,进入程序编辑窗口,在源文件处右击—>创建—>新建项—>选择C++文件命名并创建。
在文件编辑窗口中添加如下代码,分别是引入库函数,创建一个主函数,并打印输出一个字符串。
#include<iostream>
using namespace std;
int main() {
cout << "Hello World!";
system("pause");
return 0;
}
点击本地windows调制器运行程序,其中system("pause")
是让命令行窗口驻足,可以看到打印输出了字符串
2、注释
作用:对一段代码解释说明,或者暂时将某段程序注释掉以便对其他程序进行调试,方便其他程序员阅读代码。 如下代码块,//
就是单行注释的符号,/**/
可以注释多行。
#include<iostream>
using namespace std;
int main() {
//单行注释 只能注释一行
/*
* 多行注释 可以将一段文字或代码注释
*/
cout << "Hello World!";
system("pause");
return 0;
}
3、变量
作用:给一段指定的内存空间起名,方便操作这段内存。
语法:数据类型 变量名 = 初始值;
示例:
注意:创建变量时必须赋初始值,否则直接调用会出错。
4、常量
作用:记录不可更改的数据,即常量一旦赋值之后不能再进行修改。
C++常量有两种:
1.#define 宏常量:#define 常量名 常量值
在最上方定义
2.const修饰的变量 const 数据类型 常量名 = 常量值
示例:
#include<iostream>
using namespace std;
//[1]宏常量
#define MONTH 12
int main() {
cout << "一年有:" << MONTH << "个月" << endl;
//MONTH = 13; 不可以修改 会报错
//[2]const修饰的变量
const int day = 7;
cout << "一周有:" << day << "天" << endl;
//day = 8; 也不可修改
system("pause");
return 0;
}
5、标识符命名规则
- 标识符不能是关键字
- 标识符只能由字母、数字、下划线组成
- 第一个字符必须为字母或下划线
- 标识符中字母区分大小写
示例:
#include<iostream>
using namespace std;
int main() {
int int = 1; //错误 关键字不能作为标识符
int 1qq = 9; //错误 第一个字符必须是字母或下划线
int w%e = 10; //错误 标识符只能由字母、数字、下划线组成
int _abc = 1;//正确
int ab1 = 2;//正确
int a_b_1 = 3;//正确
int AaA = 1;//正确 标识符严格区分大小写
int aaa = 2; //正确 AaA与aaa不冲突,是两个变量
system("pause");
return 0;
}
二、数据类型
1.整型
数据类型 | 占用空间 | 取值范围 |
---|---|---|
short | 2字节 | (-2^15 ~ 2^15-1) |
int | 4字节 | (-2^31 ~ 2^31-1) |
long | windows为4字节,linux为4字节,8字节 | (-2^31 ~ 2^31-1) |
long long | 8字节 | (-2^63 ~ 2^63-1) |
2.sizeof关键字
作用:获取数据类型或变量所占内存大小
语法:sizeof(数据类型 / 变量)
示例:
3.实型(浮点型)
作用:记录小数
数据类型 | 占用空间 | 有效数字范围 |
---|---|---|
float | 4字节 | 7位有效数字 |
double | 8字节 | 15~16位有效数字 |
示例:
4.字符型
注意:用单引号括起单个字符,不能是多个字符,仅占1个字节
#include<iostream>
using namespace std;
int main() {
char ch = 'a';
cout << ch << endl;
cout << sizeof(char) << endl; //所占内存空间大小
int n = (int)ch;
cout << "a对应的ascii编号是:" << n << endl;
system("pause");
return 0;
}
5.字符串型
注意:需要加入头文件 #include<string>
示例:
#include<iostream>
using namespace std;
#include<string>
int main() {
string str = "hello world";
cout << str << endl;
system("pause");
return 0;
}
6.布尔类型bool
bool只有真 true
或假false
示例:
#include<iostream>
using namespace std;
int main() {
bool flag = true;
cout << flag << endl;
flag = false;
cout << flag << endl;
system("pause");
return 0;
}
7.数据的输入
作用:从键盘获取数据
关键字:cin
示例:
clude<iostream>
using namespace std;
int main() {
int a = 0;
cout << "请输入变量a的值" << endl;
cin >> a;
cout << a << endl;
system("pause");
return 0;
}
三、运算符
1.算数运算符
运算符 | 术语 | 示例 | 结果 |
---|---|---|---|
+ | 正号 | +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 |
注意:在除法运算中,除数不能为0;两个整型除法运算,除不尽时自动向下取整;只有整型变量才能取余
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 |
3.比较运算符
运算符 | 术语 | 示例 | 结果 |
---|---|---|---|
== | 相等于 | 4 == 3 | 0 |
!= | 不等于 | 4 != 3 | 1 |
< | 小于 | 4 < 3 | 0 |
> | 大于 | 4 > 3 | 1 |
<= | 小于等于 | 4 <= 3 | 0 |
>= | 大于等于 | 4 >= 1 | 1 |
注意:C++中比较运算中,“真”用数字“1”表示,“假”用数字“0”表示
4.逻辑运算符
运算符 | 术语 | 示例 | 结果 |
---|---|---|---|
! | 非 | !a | 如果a为假,则!a为真; 如果a为真,则!a为假。 |
&& | 与 | a && b | 如果a和b都为真,则结果为真,否则为假。 |
|| | 或 | a || b | 如果a和b有一个为真,则结果为真,二者都为假时,结果为假。 |
四、程序流程结构
1.选择结构
1.1 if结构
if语句得三种形式
- 单行格式if语句
- 多行格式if语句
- 多条件的if语句
单行if示例
#include<iostream>
using namespace std;
int main() {
//选择结构-单行if语句
int i = 10;
if (i > 10) {
cout << "i大于10" << endl; //当i大于10时才会进入结构并执行打印输出。
}
//当结构内只需要执行一条语句时可以省略{}
if (i < 10) cout << "i小于10" << endl;
system("pause");
return 0;
}
多行if示例
#include<iostream>
using namespace std;
int main() {
//选择结构-单行if语句
int i = 10;
if (i > 10) {
cout << "i大于10" << endl; //当i大于10时才会进入结构并执行打印输出。
}
else {
cout << "i小于等于10" << endl; //当不满足上面条件时就会自动执行下面else引导的操作
}
//当结构内只需要执行一条语句时可以省略{}
if (i < 10) cout << "i小于10" << endl;
else cout << "i大于等于10" << endl;
system("pause");
return 0;
}
多条件if结构示例
#include<iostream>
using namespace std;
int main() {
//选择结构-单行if语句
int i = 10;
if (i > 10) {
cout << "i大于10" << endl; //当i大于10时才会进入结构并执行打印输出。
}
else if (i < 10) {
cout << "i小于10" << endl;
}
else {
cout << "i等于10" << endl; //当不满足上面条件时就会自动执行下面else引导的操作
}
//当结构内只需要执行一条语句时可以省略{}
if (i < 10) cout << "i小于10" << endl;
else if (i > 10) cout << "i大于10" << endl;
else cout << "i等于10" << endl;
system("pause");
return 0;
}
嵌套if示例
#include<iostream>
using namespace std;
int main() {
//选择结构-单行if语句
int i = 17;
if (i > 10) {
if (i > 15) {
cout << "优秀" << endl;
if (i > 17) {
cout << "非常优秀" << endl;
}
else {
cout << "有点优秀" << endl;
}
}
else {
cout << "良好" << endl;
}
}
system("pause");
return 0;
}
1.2 三目运算符
作用:实现简单的判断(是或不是)
语法:表达式1 ? 表达式2 : 表达式3
说明:当表达式满足条件即为真时,执行表达式2,否则执行表达式3
示例:
#include<iostream>
using namespace std;
int main() {
//选择结构-三目
int i = 17;
bool flag;
flag=i > 10 ? true : false;
cout << i << endl;
system("pause");
return 0;
}
1.3 switch结构
作用:执行多条件分支语句
语法:
switch(表达式)
{
case 结果1:执行语句;break;
case 结果2:执行语句;break;
...
default:执行语句;break;
}
示例:
int main() {
//请给电影评分
//10 ~ 9 经典
// 8 ~ 7 非常好
// 6 ~ 5 一般
// 5分以下 烂片
int score = 0;
cout << "请给电影打分" << endl;
cin >> score;
switch (score)
{
case 10:
case 9:
cout << "经典" << endl;
break;
case 8:
cout << "非常好" << endl;
break;
case 7:
case 6:
cout << "一般" << endl;
break;
default:
cout << "烂片" << endl;
break;
}
system("pause");
return 0;
}
注意1:switch语句中表达式类型只能时整型或者字符型
注意2:case里如果没有break,那么程序会一直向下执行
2.循环结构
2.1 while循环语句
作用:满足循环条件,执行循环语句
语法:while(循环条件){循环语句块}
只要循环条件的结果的真,就执行循环语句
示例:
int main() {
int num = 0;
while (num < 10)
{
cout << "num = " << num << endl;
num++;
}
system("pause");
return 0;
}
注意:在执行循环语句时,程序必须提供跳出循环的出口,否则出现死循环
2.2 do……while循环语句
与while相比,do……while会先执行一次,不论是否满足while循环条件
示例:
int main() {
int num = 0;
do
{
cout << num << endl;
num++;
} while (num < 10);
system("pause");
return 0;
}
2.3 for循环语句
语法:for(起始表达式;条件表达式;末尾循环体){循环语句;}
示例:
int main() {
for (int i = 0; i < 10; i++)
{
cout << i << endl;
}
system("pause");
return 0;
}
嵌套循环
示例:
int main() {
//外层循环执行1次,内层循环执行1轮
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++)
{
cout << "*" << " ";
}
cout << endl;
}
system("pause");
return 0;
}
3.跳转语句
3.1 break语句
作用:跳出选择结构或者循环结构
break使用的时机:
- 出现在switch条件语句中,作用是终止case并跳出switch
- 出现在循环语句中,作用是跳出当前的循环语句
- 出现在嵌套循环中,跳出最近的内层循环语句
示例:
int main() {
//1、在switch 语句中使用break
cout << "请选择您挑战副本的难度:" << endl;
cout << "1、普通" << endl;
cout << "2、中等" << endl;
cout << "3、困难" << endl;
int num = 0;
cin >> num;
switch (num)
{
case 1:
cout << "您选择的是普通难度" << endl;
break;
case 2:
cout << "您选择的是中等难度" << endl;
break;
case 3:
cout << "您选择的是困难难度" << endl;
break;
}
system("pause");
return 0;
}
3.2 continue语句
作用:在循环语句中,跳出本次循环中余下尚未执行的语句(即存在于同级循环内continue之后的语句),继续执行下一次循环。
示例:
#include<iostream>
using namespace std;
int main() {
for (int i = 0; i < 10; i++) {
if (i % 2 == 0) {
continue;
}
cout << i << endl;
}
system("pause");
return 0;
}
五、数组
1.概念
所谓数组,就是一个集合,集合中的每个数据元素都是相同的数据类型;数组是由连续的内存位置组成的
2.一维数组
以下为数组定义的三种方式:
数据类型 数组名[ 数组长度 ];
数据类型 数组名[ 数组长度 ] ={值1,值2,值3……};
数据类型 数组名[ ] = {值1,值2……};
示例:
int main() {
//定义方式1
//数据类型 数组名[元素个数];
int score[10];
//利用下标赋值
score[0] = 100;
score[1] = 99;
score[2] = 85;
//利用下标输出
cout << score[0] << endl;
cout << score[1] << endl;
cout << score[2] << endl;
//第二种定义方式
//数据类型 数组名[元素个数] = {值1,值2 ,值3 ...};
//如果{}内不足10个数据,剩余数据用0补全
int score2[10] = { 100, 90,80,70,60,50,40,30,20,10 };
//逐个输出
//cout << score2[0] << endl;
//cout << score2[1] << endl;
//一个一个输出太麻烦,因此可以利用循环进行输出
for (int i = 0; i < 10; i++)
{
cout << score2[i] << endl;
}
//定义方式3
//数据类型 数组名[] = {值1,值2 ,值3 ...};
int score3[] = { 100,90,80,70,60,50,40,30,20,10 };
for (int i = 0; i < 10; i++)
{
cout << score3[i] << endl;
}
system("pause");
return 0;
}
数组下标是从0开始索引的
3.二维数组
二维数组的定义方式
数据类型 数组名[ 行数 ] [ 列数 ];
数据类型 数组名[ 行数 ] [ 列数 ] = { {数据1,数据2},{数据3,数据4}};
数据类型 数组名[ 行数 ] [ 列数 ] = {数据1,数据2,数据3,数据4}
数据类型 数组名 [ ] [ 列数 ]={数据1,数据2,数据3}
int main() {
//方式1
//数组类型 数组名 [行数][列数]
int arr[2][3];
arr[0][0] = 1;
arr[0][1] = 2;
arr[0][2] = 3;
arr[1][0] = 4;
arr[1][1] = 5;
arr[1][2] = 6;
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 3; j++)
{
cout << arr[i][j] << " ";
}
cout << endl;
}
//方式2
//数据类型 数组名[行数][列数] = { {数据1,数据2 } ,{数据3,数据4 } };
int arr2[2][3] =
{
{1,2,3},
{4,5,6}
};
//方式3
//数据类型 数组名[行数][列数] = { 数据1,数据2 ,数据3,数据4 };
int arr3[2][3] = { 1,2,3,4,5,6 };
//方式4
//数据类型 数组名[][列数] = { 数据1,数据2 ,数据3,数据4 };
int arr4[][3] = { 1,2,3,4,5,6 };
system("pause");
return 0;
}
六、函数
1.概述
作用:将一段经常使用的代码封装起来,减少重复代码。
2.函数的定义
一个函数由五个部分组成:
- 返回值类型:一个函数可以不回则用void,如果返回值则根据返回的类型写类型,比如返回一个整数2,则用int
- 函数名:给函数起名,注意同一个类里面不要有两个或多个相同函数名的函数。
- 参数列表:调用该函数时传入的数据
- 函数体语句:函数被调用后,内部完成的操作。
- return 表达式:当有返回值时返回。
语法
返回值类型 函数名(参数列表)
{
函数体结构
return表达式
}
示例:定义一个加法函数,实现两个数相加
//函数定义
int add(int num1,int num2){
int sum=num1+num2;
return sum;
}
3.函数的调用
语法:函数名(参数)
示例:
#include<iostream>
using namespace std;
//函数定义
int add(int num1,int num2){
int sum = num1 + num2;
return sum;
}
int main(){
int a=10;
int b=10;
//调用add函数
int sum=add(a,b);
cout<<"sum="<<sum<<endl;
a=100;
b=100;
sum=add(a,b);
cout<<"sum="<<sum<<endl;
system("pause");
return 0;
}
4 值传递
- 所谓值传递,就是函数调用时实参将数值传入给形参
- 值传递时,如果形参发生,并不会影响实参
示例:
void swap(int num1, int num2)
{
cout << "交换前:" << endl;
cout << "num1 = " << num1 << endl;
cout << "num2 = " << num2 << endl;
int temp = num1;
num1 = num2;
num2 = temp;
cout << "交换后:" << endl;
cout << "num1 = " << num1 << endl;
cout << "num2 = " << num2 << endl;
//return ; 当函数声明时候,不需要返回值,可以不写return
}
int main() {
int a = 10;
int b = 20;
swap(a, b);
cout << "mian中的 a = " << a << endl;
cout << "mian中的 b = " << b << endl;
system("pause");
return 0;
}
总结: 值传递时,形参是修饰不了实参的
5. 函数的常见样式
常见的函数样式有4种
- 无参无返
- 有参无返
- 无参有返
- 有参有返
示例:
//函数常见样式
//1、 无参无返
void test01()
{
//void a = 10; //无类型不可以创建变量,原因无法分配内存
cout << "this is test01" << endl;
//test01(); 函数调用
}
//2、 有参无返
void test02(int a)
{
cout << "this is test02" << endl;
cout << "a = " << a << endl;
}
//3、无参有返
int test03()
{
cout << "this is test03 " << endl;
return 10;
}
//4、有参有返
int test04(int a, int b)
{
cout << "this is test04 " << endl;
int sum = a + b;
return sum;
}
6. 函数的声明
作用: 告诉编译器函数名称及如何调用函数。函数的实际主体可以单独定义。
- 函数的声明可以多次,但是函数的定义只能有一次
示例:
//声明可以多次,定义只能一次
//声明
int max(int a, int b);
int max(int a, int b);
//定义
int max(int a, int b)
{
return a > b ? a : b;
}
int main() {
int a = 100;
int b = 200;
cout << max(a, b) << endl;
system("pause");
return 0;
}
七、指针
1.指针的基本概念
指针的作用:可以通过指针间接访问内存(通过变量是直接访问)
2.指针变量的定义和使用
指针变量定义语法:数据类型 * 变量名;
示例:
#include<iostream>
using namespace std;
int main() {
//1.指针的定义
int a = 10;
//指针定义语法
int* p;
//指针变量赋值
p = &a; // & 在这里是取地址符
cout << &a << endl;
cout << p << endl;
//2.指针的使用
//通过 * 操作指针变量指向的内存 *是解引用
cout << "*p=" << *p << endl;
system("pause");
return 0;
}
3.const修饰指针
const修饰指针有三种情况
- const修饰指针 ----常量指针
- const修饰常量 ----指针常量
- const既修饰指针,又修饰常量
示例:
#include<iostream>
using namespace std;
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;
}
1.常量指针(const int *p):指向可以改,值不可以改
2.指针常量(int * const p):指向不可以改,值可以改
4.指针和数组
作用:利用指针访问数组中元素
示例:
#include<iostream>
using namespace std;
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++; //因为一个数组在内存中是连续的内存空间,所以地址连续,p++就是地址加1
}
system("pause");
return 0
}
5.指针和函数
作用:利用指针函数作为参数,可以修改实参的值
示例:
#include<iostream>
using namespace std;
//值传递
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;
}
//引用传递
void swap3(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 << ";b= " << b << endl;
swap2(&a, &b); //地址传递会改变实参
cout << "地址传递后:a= " << a << ";b= " << b << endl;
swap3(a, b); //引用传递会改变实参
cout << "引用传递后:a= " << a << ";b= " << b << endl;
system("pause");
return 0;
}
八、结构体
1. 结构体基本概念
结构体属于用户自定义的数据类型,允许用户存储不同的数据类型
2. 结构体定义和使用
语法:struct 结构体名 { 结构体成员列表}
#include<iostream>
using namespace std;
#include<string.h>
//结构体定义
struct student {
//成员列表
string name;
int age;
int score;
};
int main() {
struct student stu1;
stu1.name = "张三";
stu1.age = 19;
stu1.score = 100;
system("pause");
return 0;
}
3. 结构体数组
作用:将自定义的结构体放入到数组中方便维护
语法:struct 结构体名 数组名[元素个数] = {{},{},{}}
示例:
#include<iostream>
using namespace std;
#include<string>
//结构体定义
struct student {
//成员列表
string name;
int age;
int score;
};
int main() {
//结构体数组
struct student arr[3] =
{
{"张三",19,100},
{"李四",18,90},
{"王五",20,70}
};
for (int i = 0; i < 3; i++) {
cout << "姓名:" << arr[i].name << "年龄:" << arr[i].age << "成绩:" << arr[i].score << endl;
}
system("pause");
return 0;
}
4. 结构体指针
利用->
访问结构体属性
示例
#include<iostream>
using namespace std;
#include<string>
//结构体定义
struct student {
//成员列表
string name;
int age;
int score;
};
int main() {
struct student stu1 = { "张三",19,100 };
struct student* p = &stu1;
p->name = "李四";
cout << "姓名:" << p->name << endl;
system("pause");
return 0;
}
5. 结构体嵌套结构体
实际使用中经常遇到嵌套结构体
例如:一个老师首先有自己的属性然后还要包含学生,学生又有自己的属性。
示例:
#include<iostream>
using namespace std;
#include<string>
//学生结构体定义
struct student {
//成员列表
string name;
int age;
int score;
};
//教师结构体定义
struct teacher {
//成员列表
int id;
string name;
int age;
struct student stu[3]; //子结构体 学生
};
int main() {
struct teacher t1;
t1.id = 10001;
t1.name = "老王";
t1.age = 40;
t1.stu[0] = { "张三",19,100 };
t1.stu[1] = { "李四",18,80 };
t1.stu[2] = {"王五", 17, 70};
system("pause");
return 0;
}
总结
本文删去了一些很少用到的内容,只是在入门阶段对每一部分的内容过一遍手,后续会进行更详细深度的拓展。