C/C++怎么学?我觉得看完 C/C++ 参考手册:https://zh.cppreference.com/w/%E9%A6%96%E9%A1%B5 就差不多了,但是参考手册是技术文档看起来比较生硬,所以就有了大量的课本啊教程啊,而本文呢是一篇高度浓缩的快速入门C语言的教程。(从入门到放弃233333)
## 第一个C语言程序:
``` C++
#include <stdio.h> // 调用头文件
int mian() { // 主函数,每个程序都要有主函数,必不可少,这是程序的入口
int a, b; // 定义变量
scanf("%d%d", &a, &b); // 输入
printf("%d\n", a + b); // 输出
return 0; // 返回0给操作系统,表示程序正常执行
}
// 这是单行注释
/* 这是多行注释
注释在编译的时候直接被忽略
*/
```
## 基本语法
### C 的令牌(Tokens)
C 程序由各种令牌组成,令牌可以是关键字、标识符、常量、字符串值,或者是一个符号。
http://www.runoob.com/cprogramming/c-basic-syntax.html
## 数据类型
### 1. 整数类型
| 类型 | 存储大小 | 值范围|
|---|---|---|
|char |1 byte | 0 到 255|
|int| 4 bytes| -2,147,483,648 到 2,147,483,647|
|unsigned int| 4 bytes| 0 到 4,294,967,295|
|long long 或 __int64| 8 bytes| -9223372036854775808 到 9223372036854775807|
|unsigned long long 或 unsigned __int64| 8 bytes| 0 到 18446744073709551615|
### 2. 浮点类型
| 类型 | 存储大小 | 值范围|精度|
|---|---|---|---|
|float| 4 byte| 1.2E-38 到 3.4E+38| 6 位小数|
|double| 8 byte| 2.3E-308 到 1.7E+308| 15 位小数|
|long double| 10 byte| 3.4E-4932 到 1.1E+4932| 19 位小数|
### 3. void 类型
void 类型指定没有可用的值。
## 变量
定义格式:[修饰语(可省略)] [数据类型] [变量名(一个或多个)];
例如 :
```
int a, b = 2;
const char c = '1';
```
注意作用域
## 数组
定义格式:[修饰语(可省略)] [数据类型] [数组名(一个或多个)];
例如:
```
int a[5]; //定长数组
int b[] = {1, 2, 3}; // 初始化一个为int类型长度为3的一维数组
const char c1[] = "ACM"; // 字符串即字符数组
const char c2[] = {'A', 'C', 'M'}; // 和上面定义效果一致
int vec[3][4]; // 二维数组
int vec[][3] = {1, 2, 3, 1, 2, 3}; // 初始化一个为int类型2x3的二维数组
```
注意作用域
## 输入输出
https://zh.cppreference.com/w/c/io
## 格式化输入输出
```
%d - 0 m.n |或者h 格式字符
//%转换说明的开始(占位符)
//-表示左对齐,默认是右对齐。
//0表示空位填0,省略则空位不填。
//m.n : m是域宽,指对应的输出项在输出设备占用多少个字符的宽度。n是精度,输出浮点数的时候,小数点后面的位数,默认是6。
```
|格式化控制符|说明|
|---|---------|
|%c和%hhd| char|
|%hx| 以16进制的 输出short类型的整数|
|%i/%d| int|
|%u| unsigned int|
|%lld| long long|
|%llu| unsigned long long|
|%I64d| __int64|
|%I64u| unsigned __int64|
|%x/%o| 十六进制/八进制|
|%#x/%#o| 显示各进制数前缀|
|%f/%lf/%Lf| float/double/long double|
|%g/%lg| float/double去掉了尾随的0|
|%s| 读入一个字符串,遇空格、制表符或换行符结束。|
|%p| address|
|%e| 指数形式,科学计数法|
|%nd 或 %nlld 等|也可以作为占位符打印整数数字,n是一个整数。打印结果一定占n个位置,空位置补充空格字符|
|%-nd 或 %-nlld 等 |打印结果也占n个位置,空位置出现在右边|
|%0nd 或 %0nlld 等 |打印结果也占n个位置,空位置用字符‘0’填充|
|%n.mf 或 %n.mlf 或%n.mLf |可以用来打印浮点数,打印结果中整个数字占n个位置,小数点后面占m个位置。|
## 常量
## 运算符
### 常用运算符
|赋值|自增自减|算术|逻辑|比较|成员访问|其他|
|-|-|-|-|-|-|-|
|`a = b` <br>`a += b` <br>`a -= b` <br>`a *= b` <br>`a /= b` <br>`a %= b` <br>`a &= b` <br>`a |= b` <br>`a ^= b` <br>`a <<= b` <br>`a >>= b`|`++a` <br>`--a` <br>`a++` <br>`a--`|`+a` <br>`-a` <br>`a + b` <br>`a - b` <br>`a * b` <br>`a / b` <br>`a % b` <br>`~a` <br>`a & b` <br>`a | b` <br>`a ^ b` <br>`a << b` <br>`a >> b`|`!a` <br>`a && b` <br>`a || b`|`a == b` <br>`a != b` <br>`a < b` <br>`a > b` <br>`a <= b` <br>`a >= b` <br>|`a[b]` <br>`*a` <br>`&a` <br>`a->b` <br>`a.b`|`a(...)` <br>`a, b` <br>`(type) a` <br>`? :` <br>`sizeof` <br>`_Alignof (C11 起)`|
### 优先级表
![](https://box.kancloud.cn/4de0c20247832f156eea4ccd7a7a7a59_522x861.png)
## 基本控制语句
C/C++ 语言把任何非零和非空的值假定为 true,把零或 null 假定为 false。
### 判断
|语句| 描述|
|-|-|
|if 语句| 一个 if 语句 由一个布尔表达式后跟一个或多个语句组成。|
|if...else 语句| 一个 if 语句 后可跟一个可选的 else 语句,else 语句在布尔表达式为假时执行。|
|嵌套 if 语句| 您可以在一个 if 或 else if 语句内使用另一个 if 或 else if 语句。|
|switch 语句| 一个 switch 语句允许测试一个变量等于多个值时的情况。|
|嵌套 switch 语句| 您可以在一个 switch 语句内使用另一个 switch 语句。|
|? : 运算符(三元运算符)|可以用来替代 if...else 语句。它的一般形式如下:Exp1 ? Exp2 : Exp3;|
### 循环
|循环类型 |描述|
|-|-|
|while 循环| 当给定条件为真时,重复语句或语句组。它会在执行循环主体之前测试条件。|
|for 循环| 多次执行一个语句序列,简化管理循环变量的代码。|
|do...while 循环| 除了它是在循环主体结尾测试条件外,其他与 while 语句类似。|
|嵌套循环| 您可以在 while、for 或 do..while 循环内使用一个或多个循环。|
循环控制语句
循环控制语句改变你代码的执行顺序。通过它你可以实现代码的跳转。
C 提供了下列的循环控制语句。点击链接查看每个语句的细节。
|控制语句| 描述|
|-|-|
|break 语句| 终止循环或 switch 语句,程序流将继续执行紧接着循环或 switch 的下一条语句。|
|continue 语句| 告诉一个循环体立刻停止本次循环迭代,重新开始下次循环迭代。|
|goto 语句| 将控制转移到被标记的语句。但是不建议在程序中使用 goto 语句。|
## 函数
定义格式:
```
[数据类型] [函数名] ([参数]) {
[语句1]
...
[语句n]
return [数据类型为当前函数数据类型的一个数据];
}
```
例如:
```
int max(int a, int b) {
return a > b ? a : b;
}
```
我们调用头文件的目的,就是为了调用头文件里面的函数,函数封装在头文件里面,需要时调用即可。
C 语言是面向过程的语言提供的函数库并不多,常用的有:
- <string.h>
-- strlen(s) 获取字符串长度
-- strcpy(a, b) 复制字符串b给a
-- strcmp(a, b) 比较a于b的字典序大小,a的字典序大于b返回正值,等于返回0,小于返回负值
... 等等
- <math.h>
-- sin()、cos()、tan() 三角函数
-- asin()、acos()、atan() 反三角函数
... 等等
C++ 的STL函数库里面自带了大量的高效的高级算法和数据结构,用起来十分方便高效。有兴趣请看 https://zh.cppreference.com/w/cpp
## 指针
## 结构体
一个自定义的数据类型
例如:
```
struct p { // 向量
int x, y;
p(){}
p(int _x, int _y) {x = _x, y = _y}; //自定义 a(...) 运算符
p opertor + (const p &b) {return p(x + b.x, y + b.y);} // 自定义加法运算符
p opertor - (const p &b) {return p(x - b.x, y - b.y);} // 自定义减法运算符
}
```
## 递归
递归就是自己调用自己
```
int fac(int n) { // 递归求阶乘
if(!n) return 1;
return f(n - 1) * n;
}
int gcd(int a, int b) { // 利用欧几里得算法 递归求最大公约数
reutrn b ? gcd(b, a % b) : a;
}
```
## 其他
### 宏定义
宏定义及替换
#define [被替换语句] [替换语句]
例如:
```
#define rep(i, l , r) for(int i = l, i < r; ++i) /*宏定义的高级用法*/
const int MAXN = (int)1e4 + 5; // 声明常量 也可以 #define MAXN 1e4 + 5
const int MOD = 1000000007;
sum = 0;
rep(i, 1, MAXN) rep(j, i, MAXN) {
sum += i * j;
sum %= MOD ;
}
等价于:
sum = 0;
for(int i = 1; i < 10000; ++i) for(int j = i; j < 10000; ++j) {
sum += i * j;
sum %= 1000000007 ;
}
```
## typedef
重载数据类型,针对数据类型效果和宏定义差不多。
### 头文件
一般根据自己的需要加一些宏定义、typedef、常用常量、常用头文件等专属于自己编程习惯的定义代码
```
#pragma GCC optimize ("O2")
#include <bits/stdc++.h>
using namespace std;
#define dbg(...) cerr<<"["<<#__VA_ARGS__":"<<(__VA_ARGS__)<<"]"<<endl;
#define rep(i, j, n) for(int i=j;i<n;i++)
#define per(i, j, n) for(int i=n;i>j;--i)
const int MAXN = (int)1e3 + 5;
const int INF = 0x3f3f3f3f;
const double EPS = 1e-8;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
const int MAXS = 32*1024*1024;
char buf[MAXS],*ch;
void read(int &x){while(*ch<=32) ++ch; for(x=0;*ch>='0';++ch) x=x*10+*ch-'0';}
void std_init(){ch=buf-1;fread(buf,1,MAXS,stdin);}
int main() {
return 0;
}
```
- 简介
- 零基础快速入门ACM
- C语言快速入门
- C语言快速入门
- C/C++基础
- 输入输出
- 数组和字符串
- 数组
- 字符数组
- 函数和递归
- C++标准容器库(STL)
- Vector
- Map
- Set
- String
- Stack
- Queue
- Priority_queue
- 贪心
- 硬币问题
- 区间调度问题
- 字典序最小问题
- 独木舟问题
- 搜索
- DFS
- BFS
- 剪枝
- 记忆化搜索
- 常用技巧
- 倍增
- 高精度
- 大数加法
- 大数减法
- 大数乘法
- 大数除法
- 大数阶乘
- 输入挂
- 前缀和
- 二分
- 本地预处理
- 尺取
- 枚举
- 坐标离散化
- 分治
- 数列分治
- 树上分治
- 平面分治
- 计算几何
- 凸包
- 点积
- 叉积
- 线段关系
- 皮克定理
- 最近点对
- 数据结构
- 线段树
- 树状数组
- 并查集
- 动态规划
- 基础知识
- 信息学竞赛中的动态规划
- 动态规划初步
- 最长上升子序列(LIS)
- 最长公共子序列(LCS)
- 最大子段和
- 背包问题
- 部分背包
- 0 1 背包
- 完全背包
- 多重背包
- 背包的可行性问题
- 线性DP
- 树形DP
- 区间DP
- 数位DP
- 动态规划优化
- 字符串
- KMP算法
- 拓展KMP
- 字符串Hash
- Manacher算法
- 后缀数组
- Trie树
- 博弈论
- Nim博弈
- Bash博弈
- 斐波那契博弈
- 威佐夫博弈
- SG函数
- 数论
- 整数研究
- 素数判断
- 素数筛选
- 快速幂
- 算数基本定理
- 最大公约数(Gcd)
- 费马小定理
- 扩展欧几里得
- 逆元
- 同余定理
- 组合数学
- 容斥原理
- 抽屉原理
- 卢卡斯(Lucas)
- 卡特兰(Catalan)
- 著名函数
- 欧拉函数
- 莫比乌斯函数
- 线性代数
- 矩阵运算
- 矩阵快速幂
- 图论
- 存图方法
- 邻接矩阵
- 邻接表
- Vector存图
- 链式前向星
- 图的遍历
- 拓扑排序
- 最短路
- Dijkstra算法
- SPFA算法
- Floyed 算法
- 最小生成树
- Prim算法
- Kruskal算法
- 最近公共祖先 (LCA)
- 二分图匹配
- 网络流
- 其他
- 莫队