C++基础知识
1. 变量
变量是众多语言中基础的部分。变量名就像人的名字一样,你给他取什么名字,他就代表着什么。我们不会把可乐叫成苹果,因为大家都知道他是可乐。在计算机中,我们可以构建各种变量,用来存放各种数据。
- 变量是专门用来存储数据的容器,会根据数据类型决定容量大小。当你构建整型变量时,他就是一个整型变量大小的容器
- 变量名对应着他在内存中的一个地址,方便计算时数据的存储和读取。
1.1 变量命名规则
在C++中,变量名称也叫做标识符,表示用来标记
和识别不同变量的不同符号,有一定的构造规则。
- 只能由字母、数字和下划线组成;特别的,在C++中,标识符的英文字母是区分大小写的。
例如:apple_tree是合法的,但是apple&tree是不合法的,因为其中带有符号& - 数字不可出现在第一个位置上。
- 在C++中标识符的英文字母是区分大小写的。coke≠Coke
- C++中的关键字不可以作为变量名。
例如:cout,int,include等具有特殊含义的字符不可以作为变量名称。
1.2 变量的初始化
变量的初始化,首先要对应数据类型,int类型的只能赋值整型数据,float类型只能赋值浮点型数据,依此对应。
// 错误的初始化
int a = b = 10;
int c = 5.16;
char str = "a";
// 不报错 但是错误的初始化,char类型只接受 test的第一个字符
char str = 'test';
// 正确的初始化
int a = 10;
int a, b;
a = b = 10;
float c = 2.14;
1.3 变量的输出
有一点C++基础的同学应该都知道,C++和C语言很类似,C语言中的 标准输入输出为 scanf和printf方法, 在C++中既可以支持这两种方法,其标准输入输出为cin 和cout方法。在学习的过程中,有注意到这两点的区别。查阅资料,大多数都是如下意思:
cin cout效率没scanf printf高
1.流输入输出对于基本类型来说使用很方便,不用手写格式控制字符串。
2.对于标准库的一些class来说,显然重载操作符也比自己写格式控制字符串要方便很多。
3.对于复杂的格式可以进行自定义操作符。
4.可读性更好
那么为什么在c++学习中多使用的还是cin,cout呢?主要是因为在C++中cin和cout使用起来更加安全,对于入门的学者很友好。(仅代表个人看法,欢迎指正)
2.常量
常量指不会随着程序运行而改变的量,分为两种:字面量和符号常量。
const 数据类型 常量名称 = 初始值;
或者
数据类型 const 常量名称 = 初始值;
3.顺序结构程序设计
3.1 数据类型
在前面的变量中介绍就有,在C++的变量声明前,需要给他指定的数据类型,这是作为强类型语言的特点。
// 定义方法
数据类型 变量名称
C++种的基本类型包括了整数、浮点数两种。
整数 | short | int | long | longlong | char |
---|---|---|---|---|---|
所占字节大小 | 2 | 4 | 4 | 8 | 1 |
浮点数 | float | double | long double | ||
所占字节大小 | 4 | 8 | 16 |
其中为什么char类型也是整数型呢?在计算机中,字符类型专门用来存储计算机中的基本符号:英文字母、数字以及标点符号等。计算机通过ASCll编码,将128个字符映射到对应数字上。因此,每一个字符类型也可以用对应的ASCll码值表示,故其也算作整数类型中。
3.2 位运算与表达式
4. 分支结构程序设计
4.1 关系与逻辑表达式
在编程过程中,我们往往会碰到很多需要带条件的语句。这时候就需要关系表达式来帮助计算机理解我们所给予的条件。基本上的关系表达式有如下几个: >, < ,==,>=,<=,!=,与我们理解A<B<C不一样,计算机并不能理解这样的句子,我们需要将其转化为**(A<B) && (B<C) 这时候就用上了逻辑表达式**,逻辑表达式用于连接关系表达式判断更复杂的条件是否成立。常用的逻辑运算符有以下三种:&&,||,!。
最后在C++中各种运算符中,拥有运算符优先级,优先级高的运算符将会被优先计算。具体的优先级可以去查阅官方资料学习。
4.2 switch语句
switch 用于分支结构:根据某个变量不同的值进行不同的操作
switch (变量名) {
case 变量可能的情况1: 执行语句1; break;
case 变量可能的情况2: 执行语句2; break;
...
// 可以有任意数量的 case 语句
default: 执行语句n;
}
这里面需要注意的部分就是每个case后面的break,当程序遇到break语句的时候,会跳出switch语句,结束这部分到顺序结构的下一部分。break可以帮助我们跳出switch语句,我们也可在c部分case语句后面不写break,以此来达到我们队程序的需求。
5. 循环结构程序设计
当需要重复执行一段代码很多次的时候,我们可以使用循环结构来实现。一般的循环结构包括:for循环,while循环,do while循环
for循环: 在已知循环次数的场景使用。
语法
for (循环变量赋初始值;循环条件;更新循环变量) {
循环体
}
while循环: while循环值关注循环终止的条件和循环体的内容。只要循环条件成立,就进入循环体中,否则就结束循环
while (循环成立条件) {
循环体
}
do while 循环: do while循环是类似与while循环的,与之不同的是,无论如何先进入一次循环体,再来进行循环条件的判定。
do{
循环体
}while(循环成立条件)
在循环体中还有很重要的两个语句就是break和continue 当执行到break语句时,将会跳出整个循环,不再执行循环语句。当执行到continue语句时,跳过当前循环,进入到下一次循环中。
有些时候单层循环并不能满足代码的需求,我们可以通过多重循环,就是在循环中嵌套循环的形式。
for(){
for(){
}
or
while(){
}
...
}
6. 数组
6.1 一维数组
定义: 数组是一个固定大小的相同类型元素的顺序集合,用于存储一系列数据。
// 数组的声明方式
元素类型 数组名称[数组长度];
// ps: 其中数组的长度必须是一个固定的常量,不能是变量
数组的访问方式: 通过索引来访问,一维数组的下标从0到len(数组)-1
数组的初始化方式:
// 基本格式
元素类型 数组名称[数组长度] = {元素1, 元素2, 元素3,...,元素n};
// 常见以及特殊的初始化方式
int student1[2] = {1, 2};
int student2[] = {1, 2};
// 后续未定义的默认为0填充
int student3[2] = {1};
数组的输入输出:
普通的数组只能访问单个元素,对单个元素进行输入输出。因此常常使用循环来实现数组的输入输出。
6.2 多维数组
多维数组其实就相当于多个一维数组的拼接,访问方法初始化等和一维数组的基本一致。
// 初始化
int student_info[2][2]={
{1, 21},
{2, 23}
};
cout << student_info[0][1] << endl;
7. 字符串
前面有介绍字符类型只接受一个字符,但是日常编码时经常会需要输入一串字符,比如一些英语单词等。这种时候我们可以使用字符数组,或者是string类型的变量。
字符数组是由若干个字符元素构成的数组,可以按照普通数组的方式去声明、初始化、访问元素、对元素逐个进行输入输出。
字符数组在绝大多数情况下,是用来存储字符串的,这种用字符数组存储的字符串,我们称之为字符数组型字符串。
字符数组型字符串实际上是使用字符\0终止的一维数组,数组中元素的类型是字符型,因此,字符数组长度其实比字符串的字符数量多1个。
- 字符串常用处理函数:
- 连接字符串:strcat(s1, s2), 将s2连接到s1上
- 获取字符串长度:strlen(s1)
- 比较字符串的字典序:strcmp(s1, s2)
- 复制字符串:strcpy(s1, s2)将s2字符串复制到s1上,若len(s1) > len(s2)会出现 \0 在s1中。
8. 结构体
数组可以存放一定大小的相同类型的元素,但实际场景中,往往需要我们保存一些不同类型的元素在一个容器里面。比如学校的学生有学号,姓名,年龄等信息,很显然这些数据类型并不是都是一致的。所以我们可以使用结构体 来将一组不同的类型的数据聚合成一个整体,以便处理这些信息。
// 结构体定义方式
struct 结构体名称{
数据类型1 变量名1;
数据类型2 变量名2;
...
数据类型n 变量n;
};