C参数是 int,char 为负数时可能出问题,建议转 unsigned char:
Cstrcpy、strcat 不检查缓冲区大小,易造成缓冲区溢出。
Cmath.h 所有三角函数参数是 弧度 radian ,非角度。deg → rad 公式:rad = deg * PI / 180。
C1. scanf 的变量必须加 &(取地址),否则会崩溃。 2. 正确:scanf("%d", &x); 错误:scanf("%d", x); 2. printf 的格式化符和参数类型必须匹配,否则结果未定义。 3. 比如用 %d 输出 double 会得到乱码。 4. 3. sprintf 不检查缓冲区大小,容易溢出,推荐用 snprintf。 5. 4. fopen 可能失败(文件不存在、权限不足),一定要检查返回值 是否为 NULL,不要直接使用。 6. 5. 打
C1. 函数成功时通常不会把 errno 置0,所以调用前要手动 errno = 0。 2. errno 是全局变量,多线程中每个线程有自己的 errno(线程局部存储)。
C1. setlocale 会影响全局状态,多线程中要小心。 2. 可用的本地化名称因平台而异,Windows 和 Linux 不同。
C1. 信号处理函数中只能做安全的操作(如设置标志位),不能调用 非异步信号安全的函数(如 printf、malloc),否则可能死锁。 2. 信号处理是全局的,会影响整个进程。 3. C++ 中信号处理和异常不能混用,信号处理函数中不能抛异常。 4. SIGKILL 和 SIGSTOP 不能被捕获或忽略。
C1. 可变参数函数不知道参数的个数和类型,必须通过固定参数约定 (比如第一个参数传个数,或用特殊结束标记如 NULL)。 2. va_arg 的类型必须和实际参数类型匹配,否则未定义行为。 4. 省略号 ... 必须是最后一个参数。
C1. size_t 是无符号类型,和 int 比较时要小心(比如 size_t i; i >= 0 永远为真)。 2. C++11 后用 nullptr 替代 NULL,类型更安全。 3. offsetof 只能用于标准布局类型(standard-layout type)。 4. 这个头文件通常被其他头文件自动包含,很少需要手动 #include。
C1. 浮点异常不是 C++ 异常,不会被 try/catch 捕获,只是设置标志位。 2. 修改舍入模式会影响整个线程的所有浮点运算,用完记得恢复。 3. 某些编译器需要开启特定选项才能完整支持(如 #pragma STDC FENV_ACCESS ON)。 4. 初学者一般用不到,了解有这个东西就行。
C1. PRId32 等宏展开后是字符串字面量,要和前面的 "%" 写在一起,中间不能有空格。 3. 这个头文件通常和
C1. 不是所有平台都支持 int8_t 等精确宽度类型(比如某些DSP没有8位类型), 但主流平台(x86、ARM)都支持。 2. 用 printf 输出这些类型需要配合
C1. wchar_t 的大小因平台而异(Windows 上是2字节,Linux 上通常是4字节)。 3. 宽字符和普通 char 字符串不能直接混用。
C1. 参数是 wint_t 类型(通常是 wchar_t 的无符号版本),传 wchar_t 即可。 2. 这些函数的行为受当前本地化(locale)影响。
C1. 这些函数在不同编译器上的支持程度不同,MSVC 早期版本支持不完善。 2. C++ 中还有
C1. C++ 中 and、or、not 等是关键字,不需要包含
C1. C++ 中 bool、true、false 是关键字,不需要包含
C1. C++ 中通过函数重载自动实现类型通用,不需要
C1. C++11 中 alignas 和 alignof 是关键字,不需要包含
C1. C++11 中用 [[noreturn]] 属性,不需要包含
C📚 C 语言中用 _Complex 关键字定义复数,C++ 中用 std::complex 类。 📚
C++cin >> 遇到空格、回车、Tab 就会停下来,一次只读一个"词"。
C++单独用 setprecision 控制"有效数字"总位数;配合 fixed 才控制"小数点后"位数。
C++默认会清空文件原有内容!想追加用 ios::app 模式。
C++[] 越界访问是未定义行为,可能崩溃;at() 越界会抛异常,更安全。
C++[] 有副作用:key 不存在时会自动插入并设为默认值。
C++remove 不会真正删除,只是把要保留的移到前面,返回新末尾迭代器。
C++1. - 下标从 0 开始 - 中文 UTF-8 编码下一个字占3字节,size() 返回字节数不是字数 - 大量拼接用 += 或 append,不要用 s = s + "..."(会创建临时对象)
C++string_view 不拥有数据,原字符串销毁后它就失效(悬空)。
C++参数是 int,char 为负数时可能出问题,建议转 unsigned char:
C++strcpy、strcat 不检查缓冲区大小,易造成缓冲区溢出。
C++三角函数用弧度不是角度。
C++rand() 随机性不太好,C++11 推荐用
C++创建了线程必须 join 或 detach,否则程序崩溃。
C++wait 可能被虚假唤醒,一定要用带条件判断的版本(第二个参数)。
C++get<类型>() 类型不对会抛 bad_variant_access。
C++typeid 的 name() 返回字符串不标准,GCC 下可能是 "i"、"NSt7..." 等不太可读。
C++C++字符串中 \ 要写成 \\,或用原始字符串 R"(\d+)"