C++运算符避坑指南:从整数除法到短路求值,这些细节你注意了吗?
1. 为什么运算符值得单独写一篇笔记刚学 C 那会儿我总觉得运算符这东西太基础了加减乘除谁不会啊翻书的时候都是直接跳过的。直到后来在项目里踩了几个不大不小的坑——比如整数除法把小数部分悄悄吃掉导致金额计算差了几分钱、自增运算符前置后置混用让循环逻辑跑飞、位运算优先级搞错导致标志位判断永远为真——我才意识到运算符是 C 里最容易被低估的一块内容。它看起来简单但真正写起代码来出问题往往就出在这些“看起来简单”的地方。这篇笔记就是把我这些年对 C 运算符的理解重新梳理一遍覆盖算术、关系、逻辑、位运算、赋值以及其他几类运算符。不管你是刚接触 C 的新手还是写了几年代码但想回头把基础夯实的老手应该都能从中找到一些之前没注意到的细节。我会尽量把每个运算符的用法、优先级、常见陷阱都讲清楚并且配上可以直接跑的代码示例方便你对照着验证。整篇内容会按照运算符的类别来组织每一类都会讲清楚它的作用、操作数的要求、返回值类型以及在实际编码中容易出问题的地方。尤其是位运算和赋值运算这两块很多人只是“会用”但说不清楚背后的机制我会重点展开。另外运算符优先级和结合性也是绕不开的话题我会用表格和实例帮你理清楚。2. 算术运算符不只是加减乘除那么简单2.1 五种基本算术运算符的用法与返回值C 里的算术运算符一共五个加、-减、*乘、/除、%取模。前四个不用多说加减乘除数学里怎么写代码里就怎么用。%稍微特殊一点它是取余数比如7 % 3的结果是1因为 7 除以 3 商 2 余 1。这几个运算符都是二元运算符需要两个操作数。操作数可以是各种内置数值类型包括int、float、double、char等。返回值类型遵循“类型提升”规则如果两个操作数类型不同较小的类型会向较大的类型转换。比如int和double做运算结果一定是double。int a 10; int b 3; double c 3.0; int r1 a / b; // r1 3整数除法小数部分被截断 double r2 a / c; // r2 3.333...因为 c 是 doublea 被提升为 double int r3 a % b; // r3 1取余这里有个新手特别容易踩的坑a / b当 a 和 b 都是整数时执行的是整数除法结果只保留整数部分不会四舍五入而是直接截断。如果你想要精确的小数结果必须确保至少有一个操作数是浮点类型。我见过有人在计算百分比的时候写int percent correct / total * 100;结果永远是 0就是因为correct / total先做了整数除法除非 correct 等于 total否则结果都是 0。2.2 整数除法与取模的陷阱整数除法的截断行为在 C 标准里是有明确定义的结果向零截断。也就是说-7 / 2的结果是-3而不是-4。这一点和某些语言不一样需要留意。取模运算%要求两个操作数都必须是整数类型不能是float或double。如果你需要对浮点数取模得用fmod()函数。另外取模结果的符号和被除数一致-7 % 3的结果是-17 % -3的结果是1。这个规则在实际写代码时经常被忽略导致判断奇偶性之类的逻辑出错。注意如果除数为 0整数除法会直接导致程序崩溃未定义行为浮点数除法会得到inf或nan。写代码时一定要确保除数不为零尤其是在用户输入或者外部数据参与运算的场景。2.3 算术运算符的优先级与结合性五个算术运算符的优先级从高到低是*、/、%高于、-。同一优先级的运算符从左到右结合。也就是说a - b c等价于(a - b) ca * b / c等价于(a * b) / c。这个规则本身不复杂但和后面要讲的位运算、逻辑运算混在一起的时候就容易出问题。我的建议是只要表达式中混合了不同类别的运算符就老老实实加括号。括号不花钱但能省下大量调试时间。int a 2, b 3, c 4; int r1 a b * c; // r1 14先乘后加 int r2 (a b) * c; // r2 20括号改变优先级3. 关系运算符比较背后的布尔逻辑3.1 六种关系运算符及其返回值关系运算符有六个等于、!不等于、大于、小于、大于等于、小于等于。它们用来比较两个操作数的大小关系返回一个bool类型的值true或者false。在 C 里bool类型可以隐式转换为整数true变成1false变成0。反过来整数也可以隐式转换为bool非零值变成true零变成false。这个特性在条件判断里很有用但也容易造成混淆。int a 5, b 3; bool r1 (a b); // r1 true bool r2 (a b); // r2 false int r3 (a b); // r3 1bool 隐式转为 int3.2 浮点数比较的经典坑用比较两个浮点数是否相等是 C 里最经典的陷阱之一。因为浮点数在计算机里是二进制近似表示的很多十进制小数无法精确存储。比如0.1 0.2的结果并不是精确的0.3而是一个非常接近但不等于0.3的值。double a 0.1 0.2; double b 0.3; if (a b) { // 这段代码很可能不会执行 }正确的做法是判断两个浮点数的差值是否小于一个很小的阈值通常叫 epsilon#include cmath bool almostEqual(double a, double b, double eps 1e-9) { return std::fabs(a - b) eps; }epsilon 的选取要根据实际场景来定。如果数值本身很大用绝对误差可能不合适这时候可以用相对误差fabs(a - b) / std::max(fabs(a), fabs(b)) eps。3.3 关系运算符的链式比较问题数学里我们可以写a b c表示 b 在 a 和 c 之间但在 C 里这样写是错的。因为是左结合的a b c会先算a b得到一个bool值0 或 1然后再拿这个值和 c 比较。结果往往不是你想要的。int a 1, b 2, c 3; bool r (a b c); // 等价于 ((a b) c)即 (1 3)结果为 true // 但如果 a 3, b 2, c 1 bool r2 (a b c); // (3 2) false 0然后 0 1 true结果仍然是 true所以链式比较必须拆开写a b b c。这个坑在初学者代码里非常常见而且因为结果有时候“碰巧”是对的更难被发现。4. 逻辑运算符短路求值的妙用与风险4.1 三种逻辑运算符逻辑运算符有三个逻辑与、||逻辑或、!逻辑非。和||是二元运算符!是一元运算符。它们操作的是布尔值返回值也是布尔值。两个操作数都为true时返回true否则返回false||两个操作数只要有一个为true就返回true都为false才返回false!操作数为true返回false为false返回true4.2 短路求值机制及其实际应用C 的逻辑运算符有一个非常重要的特性短路求值。对于如果左边的操作数已经是false右边的操作数就不会被计算因为整个表达式的结果已经确定为false。对于||如果左边已经是true右边也不会被计算。这个特性在实际编码中非常有用。比如判断指针是否有效再访问if (ptr ! nullptr ptr-value 0) { // 如果 ptr 是空指针ptr-value 不会被访问避免了崩溃 }如果把两个条件调换顺序写成ptr-value 0 ptr ! nullptr当 ptr 为空时就会直接崩溃。所以利用短路求值来保护后续操作是一个必须掌握的技巧。但短路求值也有风险。如果右边的表达式带有副作用比如函数调用、自增运算那么它可能不会被执行导致程序行为和预期不一致。int i 0; if (false (i)) { // i 不会执行i 仍然是 0 } if (true || (i)) { // i 不会执行i 仍然是 0 }实操心得在逻辑表达式中尽量把没有副作用的、计算成本低的判断放在左边把有副作用或者可能出错的判断放在右边。这样既能利用短路求值提高效率又能避免意外行为。4.3 逻辑运算符与位运算符的混淆新手经常把和、||和|搞混。和||是逻辑运算操作的是布尔值有短路求值和|是位运算操作的是整数的二进制位没有短路求值。虽然在某些情况下它们的结果看起来一样但语义完全不同。int a 1, b 2; bool r1 (a b); // true逻辑与 int r2 (a b); // 0位与01 10 00写条件判断时一定要用和||不要用和|除非你明确知道自己要做位运算。5. 位运算直接操作二进制位的利器5.1 六种位运算符详解位运算符有六个按位与、|按位或、^按位异或、~按位取反、左移、右移。它们直接操作整数的二进制表示在底层编程、性能优化、标志位管理等场景中非常常用。两个对应位都为 1 时结果为 1否则为 0|两个对应位只要有一个为 1 结果就为 1^两个对应位不同时结果为 1相同时为 0~把每一位取反0 变 11 变 0把二进制位向左移动指定的位数右边补 0把二进制位向右移动指定的位数左边补符号位对于有符号数或 0对于无符号数unsigned int a 0b1100; // 12 unsigned int b 0b1010; // 10 unsigned int r1 a b; // 0b1000 8 unsigned int r2 a | b; // 0b1110 14 unsigned int r3 a ^ b; // 0b0110 6 unsigned int r4 ~a; // 0xFFFFFFF332位系统上 unsigned int r5 a 2; // 0b110000 48 unsigned int r6 a 2; // 0b11 35.2 位运算的典型应用场景位运算在实际项目中有很多巧妙的应用这里列举几个我经常用到的标志位管理用一个整数的不同二进制位表示多个布尔状态节省内存且操作高效。const unsigned int FLAG_A 1 0; // 0b0001 const unsigned int FLAG_B 1 1; // 0b0010 const unsigned int FLAG_C 1 2; // 0b0100 unsigned int flags 0; flags | FLAG_A; // 设置标志 A flags | FLAG_C; // 设置标志 C bool hasB (flags FLAG_B); // 检查标志 B结果为 false flags ~FLAG_A; // 清除标志 A快速乘除 2 的幂左移 n 位等价于乘以 2 的 n 次方右移 n 位等价于除以 2 的 n 次方对于无符号数。虽然现代编译器会自动优化但了解这个等价关系有助于理解位运算的本质。交换两个数不用临时变量通过异或运算交换两个整数的值。int x 5, y 3; x ^ y; y ^ x; x ^ y; // 现在 x 3, y 5不过说实话这种写法在现代代码里更多是炫技可读性差实际项目中不建议用用临时变量交换更清晰。5.3 移位运算的未定义行为与注意事项移位运算有几个容易踩的坑第一移位的位数不能为负数也不能大于等于操作数的位宽。比如对于一个 32 位的int移位 32 位或更多是未定义行为结果不可预测。第二对负数进行右移结果是实现定义的。大多数编译器会做算术右移补符号位但标准并没有强制要求。如果代码需要跨平台最好用无符号数做移位。第三左移可能导致有符号整数溢出这也是未定义行为。比如int x 1 31;在 32 位系统上就是未定义行为因为结果超出了int的表示范围。注意做位运算时尽量使用无符号整数类型unsigned int、uint32_t等可以避免很多与符号位相关的未定义行为。6. 赋值运算符从简单赋值到复合赋值6.1 基本赋值运算符与复合赋值运算符最基本的赋值运算符是把右边的值赋给左边的变量。C 还提供了多种复合赋值运算符把算术运算或位运算和赋值合并在一起运算符等价形式说明a a b加后赋值-a a - b减后赋值*a a * b乘后赋值/a a / b除后赋值%a a % b取模后赋值a a b位与后赋值|a a | b位或后赋值^a a ^ b位异或后赋值a a b左移后赋值a a b右移后赋值复合赋值运算符不仅写起来简洁而且对于某些类型比如自定义类重载了运算符的情况可能效率更高因为它只需要计算一次左操作数。6.2 赋值运算符的返回值与链式赋值赋值表达式本身也有返回值返回的是赋值后左边变量的引用。这意味着可以链式赋值int a, b, c; a b c 10; // 从右到左执行c10然后 bc然后 ab链式赋值看起来简洁但可读性一般而且如果类型不一致可能出问题。我个人的习惯是尽量避免链式赋值每个变量单独一行清晰明了。6.3 赋值与初始化的区别这是一个概念上的区分但在实际编码中很重要初始化是在变量创建时给它一个初始值赋值是变量已经存在后修改它的值。对于基本类型两者差别不大但对于自定义类类型初始化和赋值的开销可能完全不同——初始化直接调用构造函数赋值则是先构造再调用赋值运算符。int a 10; // 初始化 int b; // 默认初始化值不确定 b 10; // 赋值实操心得能用初始化列表就用初始化列表能直接初始化就不要先默认构造再赋值。这在自定义类类型上性能差异明显也是 C 核心指南里反复强调的一点。7. 其他运算符那些容易被忽略的角落7.1 自增自减运算符的前置与后置和--分别表示自增 1 和自减 1。它们有两种形式前置a和后置a。前置形式先自增然后返回自增后的值后置形式先返回原值然后再自增。int a 5; int b a; // a 先变成 6然后 b 6 int c a; // c 6然后 a 变成 7对于内置类型前置和后置的性能差异可以忽略编译器会优化。但对于自定义类类型比如迭代器后置版本需要创建一个临时对象来保存原值开销更大。所以在循环里用迭代器时推荐用前置it而不是后置it。另外在同一个表达式中对同一个变量多次使用自增自减是未定义行为int i 0; int j i i; // 未定义行为结果不可预测这种代码在任何情况下都应该避免。7.2 条件运算符与逗号运算符条件运算符?:是 C 里唯一的三元运算符形式是条件 ? 值1 : 值2。如果条件为真返回值1否则返回值2。它经常用来替代简单的 if-else 赋值int a 10, b 20; int max (a b) ? a : b; // max 20条件运算符可以嵌套但嵌套太多会严重影响可读性建议嵌套不超过两层。逗号运算符,会依次计算左右两边的表达式返回右边表达式的值。它最常见的用途是在 for 循环里同时更新多个变量for (int i 0, j 10; i j; i, j--) { // ... }但逗号运算符在其他场景下容易造成混淆不建议滥用。7.3 sizeof、取地址与解引用运算符sizeof是一个编译期运算符返回类型或变量占用的字节数。注意它返回的是size_t类型是无符号整数。int a 10; size_t s1 sizeof(a); // 4在大多数平台上 size_t s2 sizeof(int); // 4 size_t s3 sizeof(a 1.0); // 8因为 a 1.0 是 double取地址运算符返回变量的内存地址*解引用运算符根据地址访问对应的值。这两个运算符在指针操作中无处不在也是 C/C 最核心的概念之一。int a 10; int* p a; // p 指向 a 的地址 int b *p; // b 10解引用 p注意和*在不同上下文中有不同含义。既可以是取地址运算符也可以是按位与运算符还可以是引用声明符*既可以是解引用运算符也可以是乘法运算符还可以是指针声明符。具体含义取决于上下文读代码时要结合语境判断。8. 运算符优先级与结合性速查8.1 完整优先级表运算符优先级决定了表达式中各运算符的计算顺序。下面是一张常用的优先级速查表从高到低排列优先级运算符结合性说明1::左到右作用域解析2()[].---左到右函数调用、下标、成员访问、后置自增自减3!~---*sizeof右到左逻辑非、位取反、前置自增自减、正负号、解引用、取地址、sizeof4.*-*左到右成员指针访问5*/%左到右乘除取模6-左到右加减7左到右移位8左到右关系比较9!左到右相等性比较10左到右按位与11^左到右按位异或12|左到右按位或13左到右逻辑与14||左到右逻辑或15?:右到左条件运算符16-等右到左赋值运算符17,左到右逗号运算符这张表不需要死记硬背但有几个关键点必须记住算术运算符高于关系运算符关系运算符高于逻辑运算符赋值运算符优先级很低。位运算符的优先级比较尴尬——它们比关系运算符还低所以a b c实际上等价于a (b c)这几乎肯定不是你想要的结果。8.2 优先级引发的经典错误案例int a 1, b 2, c 3; if (a b c) { // 实际等价于 a (b c)即 1 0 0条件为假 // 但写代码的人可能以为是在判断 (a b) c }正确的写法是加括号if ((a b) c)。另一个经典错误是*p。由于后置优先级高于*这个表达式等价于*(p)即先取 p 指向的值然后 p 自增。如果你想对值自增应该写(*p)。实操心得我个人的原则是只要一个表达式里出现了两种以上不同类别的运算符就加括号。括号是最便宜的文档也是最有效的防错手段。代码是给人看的不是给编译器看的。9. 常见问题与排查技巧实录9.1 运算符相关常见问题速查表问题现象可能原因排查方法解决方案整数除法结果不对两个操作数都是整数小数被截断检查操作数类型至少将一个操作数转为浮点类型浮点数比较永远为假浮点精度问题打印两个数的完整精度值用 epsilon 做近似比较条件判断结果反了和混淆检查条件里是否用了赋值条件里用或把常量写在左边位运算结果不对优先级问题检查是否缺少括号给位运算加括号自增自减结果异常同一表达式多次修改同一变量检查表达式拆成多条语句移位结果不对移位位数超出范围或负数移位检查移位位数确保移位位数在合法范围内逻辑判断没短路用了或 代替或9.2 我踩过的几个真实坑第一个坑是和的混淆。有一次写了一个条件判断if (status 1)本意是判断 status 是否等于 1结果写成了赋值status 被改成 1条件永远为真。这种错误编译器通常不会报错但逻辑完全错了。后来我养成了一个习惯条件里如果一边是常量就把常量写在左边写成if (1 status)这样如果不小心写成编译器会直接报错因为不能给常量赋值。第二个坑是位运算优先级。有一次写标志位判断写成了if (flags FLAG_A FLAG_A)本意是判断 FLAG_A 位是否被设置结果因为优先级高于实际变成了flags (FLAG_A FLAG_A)也就是flags 1完全不是想要的结果。后来我所有位运算都加括号再也没出过这个问题。第三个坑是自增运算符在函数参数里的求值顺序。C 标准没有规定函数参数的求值顺序所以func(i, i)这种写法是未定义行为不同编译器可能给出不同结果。这种代码必须拆开写。9.3 调试运算符问题的实用技巧当你怀疑某个表达式的结果不对时最直接的办法是把它拆开每一步都打印出来。比如怀疑a b * c有问题就先算b * c存到一个临时变量再算加法。这样能快速定位是哪一步出了问题。另外编译器的警告选项要开满。-Wall -Wextra能帮你发现很多潜在的运算符问题比如和混淆、有符号无符号比较、运算符优先级可疑等。不要忽略警告很多警告背后就是真实的 bug。对于位运算可以用二进制字面量C14 起支持0b前缀来写测试用例这样每一位都看得清清楚楚比十六进制直观得多。unsigned int flags 0b0000; flags | 0b0001; // 设置第 0 位 flags | 0b0100; // 设置第 2 位 // flags 现在是 0b010110. 运算符重载的简单入门虽然这篇笔记主要讲内置运算符但既然聊到了运算符就不得不提一下运算符重载。C 允许我们为自定义类型定义运算符的行为比如给一个表示复数的类重载运算符让两个复数可以直接相加。运算符重载的基本语法是定义一个名为operator加运算符符号的函数class Complex { public: double real, imag; Complex(double r 0, double i 0) : real(r), imag(i) {} Complex operator(const Complex other) const { return Complex(real other.real, imag other.imag); } }; Complex a(1, 2), b(3, 4); Complex c a b; // c (4, 6)运算符重载的规则不少比如不能改变运算符的优先级和结合性不能重载::、.、.*、?:等少数几个运算符不能创造新的运算符。而且重载要符合直觉不要给定义减法行为那只会让代码难以理解。注意运算符重载是一把双刃剑。用得好可以让代码更自然用不好会让代码变得晦涩难懂。我的建议是只有当重载后的行为非常直观、符合大多数人的预期时才使用否则宁可定义一个普通函数。11. 写在最后的一些个人体会运算符这块内容我前后翻过好几次资料每次都有新的收获。最开始觉得简单后来发现坑多再后来慢慢体会到设计者的用心——比如短路求值不只是性能优化更是一种安全机制位运算看起来底层但在处理标志位、压缩数据、实现哈希函数时无可替代赋值运算符的返回值设计让链式赋值成为可能虽然我本人不太喜欢这种风格。如果你刚开始学 C我的建议是不要跳过运算符这一章。把每个运算符的用法、返回值、优先级都亲手敲一遍代码验证比看十遍书都管用。如果你已经写了几年代码也可以回头看看自己有没有踩过上面提到的那些坑说不定能发现一些之前没注意到的细节。最后分享一个我常用的练习方法拿一段自己以前写的代码专门检查里面的运算符使用看看有没有可以加括号的地方、有没有整数除法可能截断的地方、有没有浮点数直接比较的地方。这种“代码复查”比写新代码更能提升对运算符的理解。

相关新闻

STM32串口IAP固件升级实战:分区规划、向量表重定向与避坑指南

STM32串口IAP固件升级实战:分区规划、向量表重定向与避坑指南

简介:这份源码包面向使用STM32F103C8T6进行产品开发或嵌入式学习的工程师,聚焦串口IAP在线升级固件这一常见需求,帮助读者在资源受限的Cortex-M3平台上搭建可远程更新程序的Bootloader与App框架。压缩包共430个文件,约2.23MB&…

2026/10/15 17:30:50 阅读更多 →
CEF 浏览器控件实战:从多进程架构到 JS 通信的避坑指南

CEF 浏览器控件实战:从多进程架构到 JS 通信的避坑指南

简介:这份资源面向需要在Windows桌面端嵌入网页渲染能力的C开发者,尤其是使用MFC框架、希望用Chromium内核替代传统IE控件的工程师。内容围绕谷歌CEF(Chromium Embedded Framework)浏览器控件的集成与使用展开,覆盖从C…

2026/10/15 17:30:50 阅读更多 →
C++运算符全解析:从算术到位运算的避坑指南

C++运算符全解析:从算术到位运算的避坑指南

1. 为什么运算符值得单独写一篇笔记 很多人学 C 的时候,对运算符的态度就是"这玩意儿还用学?加减乘除谁不会"。我一开始也这么想,直到有次写一个图像处理的 Demo,用位运算做像素掩码,结果因为搞混了 & …

2026/10/15 17:30:50 阅读更多 →

最新新闻

银行卡BIN码为什么用JSON格式?轻量级金融数据方案

银行卡BIN码为什么用JSON格式?轻量级金融数据方案

简介:本资源是一份面向前端开发者与支付系统工程师的银行卡BIN码验证工具集,解决银行卡号前端实时识别、发卡行匹配及卡类型判断等实际问题。压缩包内含1个核心JSON文件(bankbin.json),以标准键值对结构存储超千条国内…

2026/10/15 18:23:37 阅读更多 →
ASP.NET Core值班管理系统实战:排班、换班与统计全解析

ASP.NET Core值班管理系统实战:排班、换班与统计全解析

简介:这是一套基于ASP.NET WebForms开发的在线值班管理系统,面向需要实现单位内部排班、值班登记、调班审批、历史查询等功能的中小企业、行政部门或开发学习者,也可作为高校课程设计题目。资源压缩包共77个文件、大小仅8.39MB,主…

2026/10/15 18:23:37 阅读更多 →
精通Windows API:Win32编程实操源码包,从消息循环到二次开发

精通Windows API:Win32编程实操源码包,从消息循环到二次开发

简介:面向具备C基础、希望在Windows平台上深入系统开发的程序员,这套源码包以《精通Windows API——函数、接口、编程实例》为蓝本,覆盖窗口管理、消息循环、动态链接库、COM接口和文件操作等156个实际应用场景。压缩包共1789个文件&#xff…

2026/10/15 18:23:37 阅读更多 →
印刷企业报价系统开发实战:参数化计价引擎、数据模型与避坑指南

印刷企业报价系统开发实战:参数化计价引擎、数据模型与避坑指南

简介:面向印刷行业中小企业的报价管理系统完整工程包,涵盖报价计算、客户档案、产品目录、材料库存与设备维护等核心业务模块,帮助缺乏专业信息化工具的企业快速提升报价效率与客户管理能力。压缩包共118个文件,以C#源码&#xff…

2026/10/15 18:23:37 阅读更多 →
USB_LocalDisk 实战:将 U 盘挂载为固定本地磁盘的完整指南

USB_LocalDisk 实战:将 U 盘挂载为固定本地磁盘的完整指南

简介:USB_LocalDisk 是一份面向 Windows XP 用户的实用驱动资源,用于让系统把多分区 U 盘识别为本地磁盘,从而突破 XP 对可移动介质分区数量的限制,适合需要在旧平台上对 U 盘进行多分区管理的进阶用户。压缩包共 6 个文件&#x…

2026/10/15 18:23:37 阅读更多 →
cangjie_stdx 之 WriteConfig 完全指南:JsonWriter 序列化格式配置详解

cangjie_stdx 之 WriteConfig 完全指南:JsonWriter 序列化格式配置详解

标准库网络密码学并发编程 【免费下载链接】cangjie_stdx 仓颉编程语言提供了 stdx 模块,该模块提供了网络、安全等领域的通用能力。 项目地址: https://gitcode.com/Cangjie/cangjie_stdx 点击查看 免费下载 WriteConfig 是仓颉标准库扩展 cangjie_std…

2026/10/15 18:22:34 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →