C++

变量

命名规则

  1. 由字母(a-z & A-Z)数字(0-9)和下划线(_)构成
  2. 不能由数字开头
  3. 不能使用C++中的关键词和保留字 main using

含义

  1. 存储数据
  2. 存储最新的数据
  3. 只能存储一个数据

赋值方法

1
2
3
int a;          //先声明
a = 12; //后赋值
cout << a + 12; //使用

数据类型

数据类型范围

整数型

int: 4 byte(数据范围:-2,147,483,648 到 2,147,483,647)

long long int: 8 byte(数据范围:-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807)

short int

浮点数

单精度浮点数:float(数据有效位为7位)

双精度浮点数:double(数据有效位为14-15位)

long double

字符型

char

布尔型

booltruefalse

数据类型的转换

自动类型转换

1
2
3
4
int a = 12;
long long int b = 100000000000000;
long long int c = a + b;
cout << c;

在做自动类型转换时,编译器会自动的将数据转换为较大内存的空间去存储

int被转换为long long int

1
2
cout<< (int) 1.4272 << endl;
cout<< (int) (1.223 + 3.1311);

强制类型转换

格式:(类型) (表达式)

结果为 14

运算符

C++ 运算符 | 菜鸟教程

算术运算符

运算符 描述 实例
+ 把两个操作数相加 A + B 将得到 30
- 从第一个操作数中减去第二个操作数 A - B 将得到 -10
* 把两个操作数相乘 A * B 将得到 200
/ 分子除以分母 B / A 将得到 2
% 取模运算符,整除后的余数 B % A 将得到 0
++ https://www.runoob.com/cplusplus/cpp-increment-decrement-operators.html,整数值增加 1 A++ 将得到 11
https://www.runoob.com/cplusplus/cpp-increment-decrement-operators.html,整数值减少 1 A– 将得到 9
1
cout << 13 / 4.0;

结果为3.25

比较(关系)运算符

运算符 描述 实例
== 检查两个操作数的值是否相等,如果相等则条件为真。 (A == B) 不为真。
!= 检查两个操作数的值是否相等,如果不相等则条件为真。 (A != B) 为真。
> 检查左操作数的值是否大于右操作数的值,如果是则条件为真。 (A > B) 不为真。
< 检查左操作数的值是否小于右操作数的值,如果是则条件为真。 (A < B) 为真。
>= 检查左操作数的值是否大于或等于右操作数的值,如果是则条件为真。 (A >= B) 不为真。
<= 检查左操作数的值是否小于或等于右操作数的值,如果是则条件为真。 (A <= B) 为真。
1
cout << (112==12);

结果为0,是false

1true

逻辑运算符

运算符 描述 实例
&& 称为逻辑与运算符。如果两个操作数都 true,则条件为 true。 (A && B) 为 false。
! 称为逻辑非运算符。用来逆转操作数的逻辑状态,如果条件为 true 则逻辑非运算符将使其为 false。 !(A && B) 为 true。

位运算符

运算符 描述 实例
& 按位与操作,按二进制位进行”与”运算。运算规则:

0&0=0;
0&1=0;
1&0=0;
1&1=1; | (A & B) 将得到 12,即为 0000 1100 |
| | | 按位或运算符,按二进制位进行”或”运算。运算规则:

0|0=0;
0|1=1;
1|0=1;
1|1=1; | (A | B) 将得到 61,即为 0011 1101 |
| ^ | 异或运算符,按二进制位进行”异或”运算。运算规则:

0^0=0;
0^1=1;
1^0=1;
1^1=0; | (A ^ B) 将得到 49,即为 0011 0001 |
| ~ | 取反运算符,按二进制位进行”取反”运算。运算规则:

1=-2;
~0=-1; | (
A ) 将得到 -61,即为 1100 0011,一个有符号二进制数的补码形式。 |
| << | 二进制左移运算符。将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0)。 | A << 2 将得到 240,即为 1111 0000 |
| >> | 二进制右移运算符。将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃。 | A >> 2 将得到 15,即为 0000 1111 |

赋值运算符

运算符 描述 实例
= 简单的赋值运算符,把右边操作数的值赋给左边操作数 C = A + B 将把 A + B 的值赋给 C
+= 加且赋值运算符,把右边操作数加上左边操作数的结果赋值给左边操作数 C += A 相当于 C = C + A
-= 减且赋值运算符,把左边操作数减去右边操9作数的结果赋值给左边操作数 C -= A 相当于 C = C - A
*= 乘且赋值运算符,把右边操作数乘以左边操作数的结果赋值给左边操作数 C *= A 相当于 C = C * A
/= 除且赋值运算符,把左边操作数除以右边操作数的结果赋值给左边操作数 C /= A 相当于 C = C / A
%= 求模且赋值运算符,求两个操作数的模赋值给左边操作数 C %= A 相当于 C = C % A
<<= 左移且赋值运算符 C <<= 2 等同于 C = C << 2
>>= 右移且赋值运算符 C >>= 2 等同于 C = C >> 2
&= 按位与且赋值运算符 C &= 2 等同于 C = C & 2
^= 按位异或且赋值运算符 C ^= 2 等同于 C = C ^ 2
= 按位或且赋值运算符

头文件

1
#include <头文件名字>

<cmath>

c++ 库函数cmath - LV-MF - 博客园

数学函数

<iomanip>

iomanip setprecision() function in C++ with Examples - GeeksforGeeks

控制浮点数显示的有效数字个数:setprecision()

bits/stdc++.h

<bits/stdc++.h> in C++ - GeeksforGeeks

万能头文件(包括很多头文件)

cstring

C++ - GeeksforGeeks

memcmp

比较两个储存区string

1
2
3
char s1[10] = "1234";
char s2[10] = "4";
cout << memcmp (s1, s2, sizeof(s1));

结果为1,一位s1大于s2,参考下面:

前面 > 后面:1

前面 < 后面:-1

前面 = 后面:0

C 库函数 – memcmp() | 菜鸟教程

strcpy

复制string

1
2
3
4
char s1[10] = "100";
char s2[10];
strcpy(s2, s1);
cout << s3[10];

结果为100,因为s2复制了s1的值(100)。以下是错误示范:

1
s2 = s1; // 错误示范

不能直接等于,会报错,要用strcpy

strlen

获取字符数组的长度(储存字符数组的个数)

1
2
char s1[10] = "100";
cout << strlen(s1);

结果为3

vector

中文为向量,是一个封装了动态大小数组的顺序容器

1
2
3
4
vector<typename> name
// 例如:
vector<int> name;
vector<vector<int> > test;

push_back()

vector容器中添加元素

pop_back()

vector 容器中删除元素

clear()

清除 vector中的所有元素

insert()

插入一个元素 xinsert(it, x)

Switch 语句

C++ Switch

1
2
3
4
5
6
7
8
9
10
11
switch(表达式) {
case 常量表达式1:
程序1;
break;
case 常量表达式2:
程序2
break;
default:
程序3
break;
}
  1. 表达式的值的类型必须是整形,字符型,枚举型。
  2. 常量表达式的值的类型要和switch后面的表达式的值的类型保持一致。
  3. break 可有可无,当程序执行到break,直接跳出switch-case结构。
  4. default 可有可无,当上面所有的case都不执行时,才会执行 default

循环

  1. 循环变量初始化 init
  2. 循环条件 condition
  3. 循环体 statement(s)
  4. 迭代语句 increment

for 循环

C++ for 循环 | 菜鸟教程

1
2
3
4
循环变量初始化;
for(循环变量初始化; 循环条件; 迭代语句) {
循环体;
}

执行逻辑

执行逻辑

1
2
3
4
int i;
for(int i = 10; i < 100; i++) {
cout << i << endl;
}
1
2
3
4
int i = 10;
for(; i < 100; i++) {
cout << i << endl;
}

while 循环

C++ while 循环 | 菜鸟教程

1
2
3
4
while (循环条件) {
循环体;
迭代语句;
}

执行逻辑

执行逻辑

1
2
3
4
5
int i = 0;           // 循环变量初始化
while (i < 10) { // 循环条件
cout << i << endl; // 循环体
i++; // 迭代语句
}

do...while 循环

C++ do…while 循环 | 菜鸟教程

1
2
3
4
do {
循环体;
迭代语句;
} while (循环条件)

执行逻辑

执行逻辑

1
2
3
4
5
int i = 0;           // 循环变量初始化
do {
cout << i << endl; // 循环体
i++; // 迭代语句
} while (i < 10); // 循环条件

数组

一维数组

C++ 数组 | 菜鸟教程

声明数组

1
int 数据名arrayName[数据大小arraySize];
1
int age[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

提取数据

1
数据名[index];
1
cout << age[2];

结果为3,因为数据的index是从0开始的,所以2 的结果是3

修改数据

1
数据名[index] = 数值;
1
2
age[3] = 100;
cout << age[3];

输出结果为100,因为数据被改了

二维数组

C++ 多维数组 | 菜鸟教程

声明数组

1
int 数据名[数据大小1][数组大小2];
1
int num[2][3] = {{1, 2, 3}, {11, 22, 33}};
1
int abc[10][2] = {0};  // 可以将所有数据初始化为0

提取/修改数据

提取和修改数据的方法和一维数据一样,只不过是多加了一个index。例如:

1
cout << abc[3][4];
1
abc[3][4] = 100;

字符数组

C++ 字符串 | 菜鸟教程

声明数组

1
char 数据名[数据大小]
1
2
char s1[10] = {'h', 'e', 'l', 'l', 'o', '\0'};
char s2[10] = "hello";

s1s2 是一样的,但s2会方便很多

s1 中的\0 是结束符,需要放在最后代表字符数组结束了,参考:

\0是什么意思?_百度知道

s2里的结束符默认就有,我们看不到,所以不需要

二维字符数组

1
2
char s3[10][10] = {{'1', '2'}, {'A', 'B'}};
char s4[10][10] = {"12", "AB"};

s3s4 是一样,但s4会方便很多

string 引用数据类型

C++ Strings

string 适用于基本数据类型(int, float, char…)

1
2
string s5[10] = {"23", "abcdefg", "341hhfr"};
string s6 = "12345";

递归

函数内部在执行过程中条用他自己这个函数

递推

递推公式:只要找到递推公式,问题几乎就解决了