💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
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; } ```