⚠️ 参数是 int,char 为负数时可能出问题,建议转 unsigned char:
⚠️ strcpy、strcat 不检查缓冲区大小,易造成缓冲区溢出。
⚠️ math.h 所有三角函数参数是 弧度 radian ,非角度。deg → rad 公式:rad = deg * PI / 180。
⚠️ 1. scanf 的变量必须加 &(取地址),否则会崩溃。 2. 正确:scanf("%d", &x); 错误:scanf("%d", x); 2. printf 的格式化符和参数类型必须匹配,否则结果未定义。 3. 比如用 %d 输出 double 会得到乱码。 4. 3. sprintf 不检查缓冲区大小,容易溢出,推荐用 snprintf。 5. 4. fopen 可能失败(文件不存在、权限不足),一定要检查返回值 是否为 NULL,不要直接使用。 6. 5. 打…
⚠️ 1. 函数成功时通常不会把 errno 置0,所以调用前要手动 errno = 0。 2. errno 是全局变量,多线程中每个线程有自己的 errno(线程局部存储)。
⚠️ 1. setlocale 会影响全局状态,多线程中要小心。 2. 可用的本地化名称因平台而异,Windows 和 Linux 不同。
⚠️ 1. 信号处理函数中只能做安全的操作(如设置标志位),不能调用 非异步信号安全的函数(如 printf、malloc),否则可能死锁。 2. 信号处理是全局的,会影响整个进程。 3. C++ 中信号处理和异常不能混用,信号处理函数中不能抛异常。 4. SIGKILL 和 SIGSTOP 不能被捕获或忽略。
⚠️ 1. 可变参数函数不知道参数的个数和类型,必须通过固定参数约定 (比如第一个参数传个数,或用特殊结束标记如 NULL)。 2. va_arg 的类型必须和实际参数类型匹配,否则未定义行为。 4. 省略号 ... 必须是最后一个参数。
⚠️ 1. size_t 是无符号类型,和 int 比较时要小心(比如 size_t i; i >= 0 永远为真)。 2. C++11 后用 nullptr 替代 NULL,类型更安全。 3. offsetof 只能用于标准布局类型(standard-layout type)。 4. 这个头文件通常被其他头文件自动包含,很少需要手动 #include。
⚠️ 1. 浮点异常不是 C++ 异常,不会被 try/catch 捕获,只是设置标志位。 2. 修改舍入模式会影响整个线程的所有浮点运算,用完记得恢复。 3. 某些编译器需要开启特定选项才能完整支持(如 #pragma STDC FENV_ACCESS ON)。 4. 初学者一般用不到,了解有这个东西就行。
⚠️ 1. PRId32 等宏展开后是字符串字面量,要和前面的 "%" 写在一起,中间不能有空格。 3. 这个头文件通常和 <stdint.h> 一起使用。
⚠️ 1. 不是所有平台都支持 int8_t 等精确宽度类型(比如某些DSP没有8位类型), 但主流平台(x86、ARM)都支持。 2. 用 printf 输出这些类型需要配合 <inttypes.h> 的 PRId32 等宏。 3. C++ 中用 std::cout 输出不需要特殊处理。
⚠️ 1. wchar_t 的大小因平台而异(Windows 上是2字节,Linux 上通常是4字节)。 3. 宽字符和普通 char 字符串不能直接混用。
⚠️ 1. 参数是 wint_t 类型(通常是 wchar_t 的无符号版本),传 wchar_t 即可。 2. 这些函数的行为受当前本地化(locale)影响。
⚠️ 1. 这些函数在不同编译器上的支持程度不同,MSVC 早期版本支持不完善。 2. C++ 中还有 <codecvt> 头文件提供更面向对象的编码转换(但 C++17 已弃用)。 3. char16_t 和 char32_t 是 C++11 内置类型,不需要 <uchar.h> 也能用。 4. 转换失败时返回 (size_t)-1,并设置 errno。
⚠️ 1. C++ 中 and、or、not 等是关键字,不需要包含 <iso646.h>。 2. 这个头文件在 C++17 中已弃用,C++20 中已移除。 3. 纯 C 语言中必须包含 <iso646.h> 才能使用这些宏。
⚠️ 1. C++ 中 bool、true、false 是关键字,不需要包含 <stdbool.h>。 2. <stdbool.h> 在 C++17 中已弃用,C++20 中已移除。 3. C 语言中 _Bool 是内置类型,stdbool.h 只是提供 bool/true/false 的宏定义。 4. C 语言中 bool 变量只能存 0 或 1,赋值非 0 值会被转为 1。
⚠️ 1. C++ 中通过函数重载自动实现类型通用,不需要 <tgmath.h>。 2. <tgmath.h> 在 C++17 中已弃用,C++20 中已移除。 3. tgmath.h 的宏是通过 C11 的 _Generic 实现的(C99 用编译器内置支持)。
⚠️ 1. C++11 中 alignas 和 alignof 是关键字,不需要包含 <stdalign.h>。 2. <stdalign.h> 在 C++17 中已弃用,C++20 中已移除。 3. alignas 的值必须是 2 的幂(1、2、4、8、16、32...)。 4. 过大的对齐可能浪费内存,一般用默认对齐即可。
⚠️ 1. C++11 中用 [[noreturn]] 属性,不需要包含 <stdnoreturn.h>。 2. <stdnoreturn.h> 在 C++17 中已弃用,C++20 中已移除。 3. 如果标记了 noreturn 的函数实际上返回了,行为是未定义的(可能崩溃)。 4. main 函数不能标记为 noreturn。
📚 C 语言的「嘴巴和耳朵」——所有和外部世界的沟通都经过它。 这是你学的第一个头文件,必须 100% 掌握。 常用函数(每个函数附完整、可编译示例) printf(fmt, ...) —— 格式化输出到屏幕 复制 #include <stdio.h> int main ( void ) { int age = 20 ; double score = 95.5 ; char name[] = "Tom" ; printf ( "姓名: %s\n" , name); print…
👉 stdlib.h 更多(exit / atexit / system)→ ▼ 3.2 错误码 <errno.h> + perror ☆ ⬜ ☆ ⬜ ☆ ⬜ C 语言 是什么 📚 函数失败时怎么知道原因?errno 是「全局错误日志」。失败后立即查看或打印。 常用函数(每个函数附完整、可编译示例) errno / perror / strerror —— 三种查看错误方式 复制 #include <stdio.h> #include <errno.h> #include <…
📚 C 语言字符串函数,操作以 '\0' 结尾的字符数组。 📚 C++ 推荐用 string,但和 C 代码交互时还会遇到。 常用函数(每个函数附完整示例) strlen(s) —— 字符串长度(不含 '\0') 复制 #include < string .h> #include <stdio.h> int main () { char src[ 50 ] = "Hello" ; int n = strlen (src); // n = 5 printf ( "长度:%d\n…
📚 浮点数学库:幂/开方/三角/对数/取整/取余/拆分。 某些 Linux 平台编译需要链接 -lm。 常用函数(每个函数附完整、可编译示例) fabs(x) 绝对值 —— 绝对值 复制 #include <stdio.h> #include <math.h> int main ( void ) { printf ( "| -3.14 | = %.2f\n" , fabs (- 3.14 )); printf ( "| 2.71 | = %.2f\n" , fabs ( 2.…
常用函数(每个函数附完整示例) rand() —— 生成 0 到 RAND_MAX 的随机整数 复制 #include <stdlib.h> #include <stdio.h> int main () { int r = rand (); printf ( "随机数:%d\n" , r); return 0 ; } srand(seed) —— 设置随机数种子(不设则每次序列相同) 复制 #include <stdlib.h> #include <time.h> #incl…
📚 很多库函数失败时会设置一个全局变量 errno, 你可以通过检查 errno 的值来判断具体出了什么错。 📚 C 语言中叫 。 类比 🏠 就像快递员送件失败后,会在系统里填一个"失败原因代码" (比如"地址不存在""客户拒收"),你查这个代码就知道为啥失败了。 常用错误码(每个附完整示例) errno —— 全局错误码变量 函数失败时被设置,成功时通常不修改(所以调用前最好先置0)。 复制 #include <errno.h> #include <math.h> #inc…
📚 C 语言中叫 。 类比 🏠 就像水杯的"容量参数表":最大装多少、最小刻度是多少、 精度能到小数点后几位。 常用宏(每个附完整示例) FLT_MAX / DBL_MAX / LDBL_MAX —— 各类型最大正值 复制 #include < float .h> #include <stdio.h> int main () { printf ( "float 最大值:%e\n" , FLT_MAX); printf ( "double 最大值:%e\n" , DBL_MAX…
📚 C 语言中叫 。 类比 🏠 就像游戏里的"存档点":先在某个位置存档(setjmp), 后面遇到危险可以直接读档回到这个位置(longjmp)。 常用函数(每个附完整示例) setjmp(env) —— 保存当前执行环境到 env,第一次调用返回0 env 是 jmp_buf 类型变量。 复制 #include <setjmp.h> #include <stdio.h> jmp_buf env; void do_something () { printf ( "执行中..…
📚 C 语言中叫 。 类比 🏠 就像一个"万能收纳盒",不管你放多少东西进去,它都能装下, 你可以按顺序一个个拿出来。 常用宏(每个附完整示例) va_list —— 可变参数列表类型 用来保存可变参数的状态。 复制 #include <stdarg.h> #include <stdio.h> // 计算任意个整数的和,第一个参数是参数个数 int sum ( int count, ...) { va_list args; va_start (args, count); //…
📚 很多其他头文件都会自动包含它,所以通常不需要手动包含。 📚 C 语言中叫 。 类比 🏠 就像工具箱里的"通用零件":螺丝、螺母、垫片,到处都要用, 但你不会专门去买,通常随其他工具一起送。 常用类型和宏(每个附完整示例) size_t —— 无符号整数类型,表示大小/计数 sizeof 运算符返回的类型,数组下标、字符串长度都用它。 复制 #include <stddef.h> #include <stdio.h> int main () { size_t len = s…
📚 可以获取和设置浮点数的舍入方式,检测是否发生了除零、溢出等异常。 📚 C 语言中叫 。 类比 🏠 就像计算器的"设置菜单":可以设置四舍五入还是向上取整, 还能查看之前计算时有没有出错(除零、溢出等)。 常用函数和宏(每个附完整示例) feclearexcept(exceptions) —— 清除指定的浮点异常标志 🎯 exceptions:FE_DIVBYZERO(除零)、FE_INEXACT(不精确)、FE_INVALID(无效)、 FE_OVERFLOW(上溢)、F…
📚 C 语言中叫 。 类比 🏠 就像不同型号的电池需要不同的充电器:int32_t、int64_t 等定宽整数 在 printf 中需要用专门的格式化宏,不能直接用 %d 或 %ld。 常用格式化宏(每个附完整示例) PRIdN / PRIuN / PRIxN —— printf 格式化宏(d=有符号十进制,u=无符号,x=十六进制) 🎯 N 可以是 8、16、32、64、FAST8、FAST16、FAST32、FAST64、LEAST8 等, 还有 MAX(最大宽度)、PT…
📚 C 语言中叫 。 类比 🏠 就像标准尺寸的螺丝:M3、M4、M5,不管哪个厂家生产,尺寸都一样。 🏠 int 在不同平台可能是16位、32位或64位,但 int32_t 永远是32位。 常用类型(每个附完整示例) intN_t / uintN_t —— 精确宽度整数(N=8,16,32,64) 🎯 intN_t 是有符号,uintN_t 是无符号,恰好占 N 位。 复制 #include <stdint.h> #include <stdio.h> int main () …
📚 用于处理 Unicode 等多字节字符集。 📚 C 语言中叫 。 类比 🏠 如果说 char 是"单人间"(只能放ASCII字符),那 wchar_t 就是"套间" (能放更大的字符,如中文、日文)。 🏠 <wchar.h> 就是宽字符版的工具箱。 常用函数(每个附完整示例) wcslen(s) —— 宽字符串长度 复制 #include <wchar.h> #include <stdio.h> int main () { const wchar_t * s = L "H…
📚 判断宽字符是否是字母、数字、空格等,以及大小写转换。 📚 C 语言中叫 。 类比 🏠 <ctype.h> 是"普通字符的分类器",<wctype.h> 就是"宽字符的分类器", 能识别中文、日文等宽字符的属性。 常用函数(每个附完整示例) iswalpha(c) —— 是否是字母 复制 #include <wctype.h> #include <stdio.h> int main () { wchar_t c = L 'A' ; wprintf (L "iswalpha(…
📚 C 语言中叫 (C11 新增)。 类比 🏠 就像翻译官:能把 UTF-8 编码的字符翻译成 UTF-16 或 UTF-32, 也能反过来翻译。 常用类型和函数(每个附完整示例) char16_t / char32_t —— 16位/32位字符类型(C++11 内置类型) 复制 #include <uchar.h> #include <stdio.h> int main () { printf ( "char16_t 大小:%d 字节\n" , sizeof ( char1…
以下头文件在 C++17 中已弃用,C++20 中已移除,因为 C++ 有更好的替代方案。 但在纯 C 语言中仍然常用,下面逐个详解: ▼ 15.16 <iso646.h> —— 运算符别名宏 ☆ ⬜ ☆ ⬜ ☆ ⬜ C 语言 是什么 📚 C 语言中为了方便不支持某些符号的键盘和字符集,提供了运算符的文字别名。 📚 比如 and 代替 &&,or 代替 ||,not 代替 !。 📚 在 C++ 中这些是关键字,不需要包含头文件;但在 C 语言中需要包含 <iso646.h>。…
📚 C 语言中用 _Complex 关键字定义复数,C++ 中用 std::complex 类。 📚 <complex.h> 是 C++ 对 C 语言 <complex.h> 的兼容版本。 ⚠️ 注意:下面的代码示例使用 C 语言语法(double complex、I 宏),因为 <complex.h> 是 C 兼容头文件。
在纯 C++ 中这些代码可能无法编译,C++ 程序员应使用 <complex> 头文件的 std::complex 类。 类比 🏠 如果说普通数学是"实数的世界",那 complex.h 就是"复数的世界"。 🏠 它让你能直接计算带虚数 i 的数学问题,比如 sqrt(-1) = i。 C 语言复数类型 类型 说明 float _Complex 单精度复数(float 实部+虚部) double _Complex 双精度复数(最常用) long double _Complex…
📚 它让你用一个函数名(如 sqrt)自动根据参数类型调用对应的函数版本。 📚 比如 sqrt(x):x 是 float 调 sqrtf,x 是 double 调 sqrt,x 是 long double 调 sqrtl。 类比 🏠 就像自动售货机:你投入不同大小的硬币,它自动识别并给出对应商品。 🏠 tgmath.h 让你不用手动区分 sqrtf/sqrt/sqrtl,写一个 sqrt 就行。 为什么需要 📌 C 语言中数学函数有三个版本: - float 版本:sqrtf…
📚 提供 alignas 和 alignof 两个宏,用于控制变量的内存对齐方式。 📚 内存对齐影响数据访问速度和某些硬件要求。 类比 🏠 如果说内存是"停车场",对齐就是"车位大小"。 🏠 4 字节对齐的变量只能停在 4 的倍数车位,虽然可能浪费一点空间,但访问更快。 🏠 alignas 就是"指定车位大小",alignof 就是"查询某车型需要多大车位"。 定义的宏 宏名 说明 alignas 指定变量或类型的对齐字节数(C++ 中是关键字) alignof 查询类型的对…
📚 比如 exit()、abort() 这类函数,调用后程序直接结束,不会返回到调用点。 📚 标记后编译器可以做更好的优化(不需要保存返回地址等)。 类比 🏠 如果说普通函数是"借出去的东西会还回来",那 noreturn 函数就是"肉包子打狗——有去无回"。 🏠 告诉编译器:这个函数调用后不用等它返回,直接处理后续逻辑或结束。 定义的宏 宏名 说明 noreturn 标记函数不返回(C++ 中用 [[noreturn]] 属性) __noreturn_is_defined …
⚠️ cin >> 遇到空格、回车、Tab 就会停下来,一次只读一个"词"。
⚠️ 单独用 setprecision 控制"有效数字"总位数;配合 fixed 才控制"小数点后"位数。
⚠️ 默认会清空文件原有内容!想追加用 ios::app 模式。
⚠️ [] 越界访问是未定义行为,可能崩溃;at() 越界会抛异常,更安全。
⚠️ [] 有副作用:key 不存在时会自动插入并设为默认值。
⚠️ remove 不会真正删除,只是把要保留的移到前面,返回新末尾迭代器。
⚠️ 1. - 下标从 0 开始 - 中文 UTF-8 编码下一个字占3字节,size() 返回字节数不是字数 - 大量拼接用 += 或 append,不要用 s = s + "..."(会创建临时对象)
⚠️ string_view 不拥有数据,原字符串销毁后它就失效(悬空)。
⚠️ 参数是 int,char 为负数时可能出问题,建议转 unsigned char:
⚠️ strcpy、strcat 不检查缓冲区大小,易造成缓冲区溢出。
⚠️ 三角函数用弧度不是角度。
⚠️ rand() 随机性不太好,C++11 推荐用 <random>。
⚠️ 创建了线程必须 join 或 detach,否则程序崩溃。
⚠️ wait 可能被虚假唤醒,一定要用带条件判断的版本(第二个参数)。
⚠️ get<类型>() 类型不对会抛 bad_variant_access。
⚠️ typeid 的 name() 返回字符串不标准,GCC 下可能是 "i"、"NSt7..." 等不太可读。
⚠️ C++字符串中 \ 要写成 \\,或用原始字符串 R"(\d+)"
📚 iostream = input + output + stream,即"输入输出流"。 📚 可以把它想象成一根水管:数据像水一样在程序和你之间流动。 cin —— 标准输入(从键盘读数据) 🎯 类比:程序的"眼睛",看你在键盘上打了什么。 📌 说明: • 用法:cin >> 变量; 复制 // 完整可运行程序:演示 cin 的基本用法 #include <iostream> #include < string > using namespace std; int mai…
🎯 类比:程序的"嘴巴",把信息说给你听。 📌 说明: • 用法:cout << 要显示的内容; 复制 // 完整可运行程序:演示 cout 的基本用法 #include <iostream> #include < string > using namespace std; int main () { // 场景1:输出字符串 cout << "Hello" << endl ; // 屏幕显示 Hello // 场景2:输出字符串和变量拼接 cout << "年龄:" << …
• endl 不只是换行,还会"刷新缓冲区"(强制立刻显示) • 大量输出时频繁用 endl 会稍慢,只想换行推荐用 '\n' • 比如循环输出10000行,用 '\n' 比 endl 快不少 flush —— 刷新缓冲区 🎯 一句话理解:flush 是"催一下",让缓冲区里的内容立刻显示出来。 📌 什么时候用? • 一般不需要手动调用,endl 会自动刷新 • 特殊场景:输出提示后不换行,但想立刻让用户看到(如"正在加载...") • 比如进度条、等待提示等场景 复制 #i…
🎯 n 只能是 8、10、16。 💡 小贴士: • 也可以直接用 hex / oct / dec。 复制 #include <iostream> #include <iomanip> using namespace std; int main () { cout << setbase ( 16 ) << 255 << endl ; // 输出 ff(十六进制) cout << setbase ( 8 ) << 255 << endl ; // 输出 377(八进制) cout…
模式 说明 ios::in 读模式(ifstream 默认) ios::out 写模式(ofstream 默认,清空原内容) ios::app 追加模式(末尾添加,不清空) ios::trunc 截断模式(清空原内容) ios::binary 二进制模式(默认文本模式) 读文件的三种方式 方式一:>> 逐个读(遇空格/换行停止) 复制 #include <fstream> #include <iostream> #include < string > using namesp…
2. 三种遍历方式 // 方式一:下标遍历 [示例] #include <vector> #include <iostream> using namespace std; int main() { vector<int> v = {10, 20, 30}; for (int i = 0; i < v.size(); i++) { cout << v[i] << " "; } cout << endl; return 0; } // 方式二:范围 for(C++11,推荐) […
2. 场景:需要 key-value 映射且 key 要排序、需要范围查询 ▼ 2.11 <unordered_set> / <unordered_multiset> —— 无序集合(C++11) ☆ ⬜ ☆ ⬜ ☆ ⬜ C++ 是什么 📚 和 set 功能一样(存不重复元素),但底层是哈希表,元素不排序。 📚 类比:不排序的收纳盒,但找东西特别快。 和 set 的区别 unordered_set:平均 O(1) 查找,元素无序,内存稍大 set: O(log n) 查找,元…
2. 通常先排序再去重: sort(v.begin(), v.end()); v.erase(unique(v.begin(), v.end()), v.end()); [示例] #include <algorithm> #include <vector> #include <iostream> using namespace std; int main() { vector<int> v={1,1,2,2,3}; sort(v.begin(), v.end()); v.er…
📚 类比:给你一张写着文字的纸的"照片",能看不能改,也不用复印。 为什么需要 函数参数用 string 会拷贝一份,浪费时间内存。 用 string_view 不拷贝,直接"看"原字符串。 复制 #include <string_view> #include <iostream> #include < string > using namespace std; void print (string_view sv) { cout << sv << endl ; } int …
一组函数,判断单个字符是什么类型,或转换大小写。 常用函数(每个函数附完整示例) isalpha(c) —— 是否字母(a-z, A-Z) 复制 #include <cctype> #include <iostream> using namespace std; int main () { char c = 'A' ; if ( isalpha (( unsigned char )c)) cout << "是字母" << endl ; return 0 ; } isdigit…
📚 C 语言字符串函数,操作以 '\0' 结尾的字符数组。 📚 C++ 推荐用 string,但和 C 代码交互时还会遇到。 常用函数(每个函数附完整示例) strlen(s) —— 字符串长度(不含 '\0') 复制 #include <cstring> #include <iostream> using namespace std; int main () { char src[ 50 ] = "Hello" ; int n = strlen (src); // n = …
常用函数一览(每个函数附完整示例) 【基本】 abs(x) / fabs(x) —— 绝对值(fabs 专门用于浮点) 复制 #include <cmath> #include <iostream> using namespace std; int main () { int a = abs (- 5 ); // a = 5 double b = fabs (- 3.14 ); // b = 3.14 cout << "a=" << a << ", b=" << b << e…
2. C++20 可用 <numbers> 中的 std::numbers::pi。 ▼ 5.2 <cstdlib> —— 随机数与通用工具 ☆ ⬜ ☆ ⬜ ☆ ⬜ C 兼容 常用函数(每个函数附完整示例) rand() —— 生成 0 到 RAND_MAX 的随机整数 复制 #include <cstdlib> #include <iostream> using namespace std; int main () { int r = rand (); cout << "随…
📚 两部分:随机数引擎(生成原始随机数)+ 分布(映射到想要的范围) 随机数引擎(每个附完整示例) mt19937 / mt19937_64 —— 梅森旋转(最常用,32/64位) 复制 #include <random> #include <iostream> using namespace std; int main () { mt19937 rng ( 42 ); // 用固定种子42创建引擎 int r = rng (); // 生成一个随机数 cout << "随机…
为什么需要锁 多线程同时修改同一变量会出问题(数据竞争)。 锁保证同一时间只有一个线程访问共享数据。 类比:公共厕所,一个人进去锁门,其他人等。 mutex —— 普通互斥锁 复制 #include < mutex > #include <iostream> using namespace std; int main () { mutex mtx; mtx. lock (); // 加锁(已被锁则等待) // 操作共享数据 cout << "已加锁" << endl ; mt…
📚 类比:餐厅点菜给你取餐号(future),饭做好了凭号取。 async —— 异步执行函数 复制 #include < future > #include <iostream> using namespace std; int main () { future < int > f = async ([]{ return 42 ; }); // 后台执行 // ... 做其他事 ... int result = f. get (); // 取结果(没好会等待) cout <…
📚 类比:"万能盒子",什么都能装,但取时要知道装的是什么。 复制 #include < any > #include < string > #include <iostream> using namespace std; int main () { any a; a = 42 ; a = string ( "hello" ); a = 3.14 ; if (a. type () == typeid ( int )) cout << any_cast< int >(a) <<…
📚 类比:高级搜索框,用规则描述"我要找什么样的文字"。 regex —— 正则表达式对象 复制 #include < regex > #include < string > #include <iostream> using namespace std; int main () { regex pattern ( "\\d+" ); // 匹配一个或多个数字 cout << "正则表达式已创建" << endl ; return 0 ; } ⚠️ C++字符串中 \ 要写成…