C语言运算符优先级:结合性与求值顺序避坑指南
写 C 语言的人十个里有九个在运算符优先级上栽过跟头。C语言运算符优先级这个知识点看着就是一张表但实际写代码时它坑起人来从不手软哪怕写了多年的老手偶尔也会被*p或1 2 3这种组合膈应一下。这篇文章不是把教科书那套优先级从上到下抄一遍完事而是结合我在改 bug、带新人、刷题过程中反复踩过的真实场景把优先级、结合性、求值顺序这三个最容易搞混的概念一次讲清楚。适合刚学完 C 语言基础、正准备做练习或课程设计的同学也适合把 C 语言当工具、但偶尔被表达式坑一把的开发者。1. 运算符优先级全景表从高到低给运算符排队1.1 一张表看全所有运算符C 语言的运算符一共十几级不可能每次写代码都翻标准文档。我把最常用的运算符按优先级从高到低整理成一张表标注了结合方向。你不需要背每一个位置先建立整体轮廓。优先级高→低运算符结合性说明1()[]-.左结合函数调用、下标、成员访问2!~---*sizeof(类型)右结合单目运算、取地址、解引用、强制类型转换3*/%左结合乘法、除法、取余4-左结合加法、减法5左结合左移、右移6左结合关系比较7!左结合相等判断8左结合按位与9^左结合按位异或10|左结合按位或11左结合逻辑与12||左结合逻辑或13?:右结合条件运算符14-*/%^|右结合赋值15,左结合逗号运算符几个关键规律先记住后面基本不用看表。一是单目运算符整体高于所有双目运算符。!~--*sizeof这些动作都会在加减乘除、位运算、逻辑运算之前先吸附到自己左边那个变量上。二是双目运算符之间大体按照算术、移位、关系、相等、位、逻辑、赋值逐级降低。这里有个细节要注意相等运算符!的优先级低于但高于位运算。三是赋值和条件运算符是少数从右往左结合的家伙这也解释了为什么a b c 0能成立。1.2 结合性到底影响什么优先级决定了不同运算符谁先粘到操作数上结合性决定的是同一优先级运算符从左到右还是从右到左粘。这是两个独立维度但经常有人混在一起。左结合的例子是减法a - b - c是(a - b) - c这是大家默认的数学直觉。右结合的例子是赋值a b c如果从左往右算就变成(a b) c显然不对因为赋值表达式的结果是右值不能再被赋值所以标准规定赋值从右往左即a (b c)。条件表达式同理a ? b : c ? d : e要从右往左解析成a ? b : (c ? d : e)这和大家的阅读习惯不一样是隐藏坑。结合性的作用可以生活化类比一群人排队领餐规定先到先服务就是左结合从队尾开始往前处理就是右结合。绝大多数运算符按自然顺序左结合只有自增、取址、强制转换、赋值、条件这些动作型运算符是右结合。后面讲到*p时你会更直观地感受到这一点。2. 最容易翻车的几组优先级对比2.1 自增自减与指针*p到底先算谁这是 C 语言里被问得最多的优先级问题之一。看代码#include stdio.h int main(void) { int arr[] {10, 20, 30}; int *p arr; int a *p; // a 得到 10然后 p 指向 arr[1] int b (*p); // b 得到 20然后 arr[1] 从 20 变成 21 printf(a%d, b%d, arr[1]%d\n, a, b, arr[1]); return 0; }*p等价于*(p)因为后置的优先级比单目*高。所以它做的是先取出当前指针指向的值然后指针后移一位。这是遍历数组时最经典的写法我用它写过无数个循环但初学的人第一眼基本都会理解成先让指针指向的值加一。(*p)才是把 p 指向的那个元素加一指针本身不动。区分这两者最好的方法就是记一句话*p是移动指针(*p)是修改数据。类似的还有*p因为前置和*同级且从右往左结合所以等价于*(p)先移动指针再取值。这三个写法的行为完全不同调试的时候如果发现指针游走得莫名其妙先检查是不是这里写混了。数组下标和取地址也常在这类问题里出现。arr[i]里[]的优先级高于所以它等价于(arr[i])也就是元素 arr[i] 的地址。有些新手会纠结要不要写(arr)[i]那个就是完全不同的东西了你几乎永远用不到。2.2 位运算、关系运算与逻辑运算混用的灾难位运算和关系运算混在一起属于编译器救不了你逻辑也不会报错的典型翻车场景。最知名的一个例子if (x y 0) { // 你以为在判断 (x y) 0 // 实际上编译器读成 x (y 0) }因为的优先级高于所以x y 0被解析成x (y 0)y 先和 0 比较得到一个 0 或 1 的结果再和 x 做按位与。判断某个位是否为 0这种高频需求这么写直接就废了。正确写法必须是if ((x y) 0)。我自己带新人时还见过更隐蔽的版本比如判断一个整数是奇数if (num 1 0) // 错误实际是 num (1 0)也就是 num 0永远为 0永远进不了分支调试到怀疑人生。正确的写法是if ((num 1) 0)或者干脆用if (num % 2 0)后者反而更清晰。逻辑运算符和||的优先级低于关系运算这一点倒是符合直觉。if (ch a ch z)能正确解析成(ch a) (ch z)不需要括号。但为了照顾阅读速度我仍然习惯给关系比较加上括号减少队友产生误判的几率。还有一个 KR 时代就存在的经典案例int c; while (c getchar() ! EOF) { // 实际上等价于 c (getchar() ! EOF) // c 永远是 0 或 1 }由于!优先级高于这里必须先加括号while ((c getchar()) ! EOF)。这种代码在文件读取、字符处理场景很常见一旦少一个括号程序会静默地产生错误结果而且很难靠肉眼发现。2.3 移位运算符与加减法1 2 3不等于(1 2) 3移位运算在嵌入式编程里非常常用但它的优先级比加减法低很多人不知道。看这两个表达式int a 1 2 3; // 等价于 1 (2 3)结果是 32 int b (1 2) 3; // 结果是 7写寄存器时如果心里想着把第 3 位拉高实际可能算出完全不同的数。比如你要表示1 左移 port 位再加上 basebase 1 port会被解析成base (1 port)如果这不是你的本意必须写成(base 1) port。我见过一个实际的 bug某段代码要生成一串占空比配置值写成period 1 shift整整差了 1 个周期因为先结合了。从那以后我定了条规矩凡是涉及移位和加减法混写的表达式一律加括号哪怕我知道优先级也不赌队友知道。2.4 scanf 与取地址运算符为什么总有人在这里翻车热词里很多人搜 scanf这个函数本身不难难的是它必须传地址。常见错误是这样int n; scanf(%d, n); // 错误没加 scanf(%d, n); // 正确是单目取地址运算符优先级很高仅次于[]和()。所以scanf(%d, arr[i])等价于scanf(%d, (arr[i]))编译器先算arr[i]这个元素再取它的地址。这里不用你自己考虑[]和谁先谁后因为[]先算本来就是正确的意图。真正容易出问题的写法是嵌套下标或指针场景比如scanf(%d, p-val); // - 的优先级高于 等价于 (p-val) scanf(%d, matrix[i][j]); // 等价于 (matrix[i][j])如果 p 本身是二级指针有人会写scanf(%d, p)这没问题但有人想取p指向的那块内存地址却写成scanf(%d, p)然后发现 scanf 修改了指针变量本身。这种问题已经不只是优先级而是要分清取指针变量的地址和取指针指向的内存地址。后者应该直接scanf(%d, p)因为 p 本身就是地址。每次看到这类错误我都会强调一句先理解数据的内存布局再谈优先级优先级只是帮助你确认代码的语法结构。3. 优先级、结合性与求值顺序不是一回事3.1 优先级只决定括号怎么套不决定谁先执行这里要澄清一个几乎人人都会误解的点运算符优先级高不代表它会被先执行。看这个表达式int result f() g() * h();按优先级语法结构是f() (g() * h())乘法先结合。但 C 语言标准并没有规定 f、g、h 这三个函数的调用顺序。编译器可能先调 f也可能先调 g这取决于平台、优化级别和编译器的具体实现。优先级管的是表达式语法上怎样分组不是运行时谁先算。我举个例子说明差别。加法满足交换律时看起来无所谓但如果函数有副作用就不一样了int count 0; int f(void) { count; return count; } int g(void) { count; return count; } int h(void) { count; return count; } int result f() g() * h();三个函数谁先调用最终 count 的中间值就不同进而影响每个函数的返回值。这种代码在不同编译器、不同优化等级下结果可能都不一样属于典型的不可移植代码。真正要命的是同一个表达式里既读一个变量又修改它。优先级救不了你序列点才能约束这种行为。所以写代码时别把一堆有副作用的函数调用塞进一个表达式拆成多行既安全又清爽。3.2 序列点与副作用i i为什么是未定义行为C 语言标准规定在两个相邻序列点之间同一个标量对象最多只能被修改一次。完整表达式结束的分号是序列点、||的左侧是序列点条件运算符?:第一个表达式之后是序列点逗号运算符左侧也是序列点。于是下面的代码就是未定义行为int i 1; int a i i;这里的赋值语句里i被修改了两次中间没有序列点标准认为这种行为的结果是未定义的。不同编译器给出的结果可能完全不同我在 gcc 和 clang 上实测过得到的答案都不一样而且开不同的优化级别结果还会变。还有一个更经典的炫技写法int x 5, y 10; x ^ y ^ x ^ y; // 未定义行为很多人把它当整数交换的奇技淫巧但它在 C 语言标准下同样是未定义行为因为 x 在同一个求值过程中被多次写入。就算你改成三条独立的位运算交换x ^ y; y ^ x; x ^ y;这也是一个让你追查半天的隐患如果 x 和 y 在特殊场景下指向同一个存储位置结果会被清零。比如你在写一个数组元素的自交换操作或者封装一个函数交换两个数组下标时传入了同一个下标那这个看似聪明的位运算交换直接翻车。我的建议就一句话需要临时变量就老实声明一个 tmp别为了一点性能幻觉去写未定义行为。现代编译器在开启优化后tmp a; a b; b tmp;的代码生成效率丝毫不比位运算差可读性却高出太多。3.3 条件运算符与赋值的右结合a ? b : c ? d : e怎么读条件运算符?:的优先级很低只比赋值和逗号高一点而且它是右结合的。所以int result a ? b : c ? d : e;会被解析成a ? b : (c ? d : e)不是(a ? b : c) ? d : e。从人类阅读习惯看通常想要的是前者所以右结合在这里歪打正着。但如果你真的想要后一种效果必须自己加括号。赋值运算符也是右结合这带来一个实用特性a b c 0;等价于a (b (c 0))。这种连续清零的写法很常见。可如果写错了初始化顺序比如int a b c 0;在声明语句里这样写就是语法错误因为a b中的 b 还没定义。声明时的初始化不是表达式语句不能默认b已经存在。这个坑很多人遇到时会懵以为和a b c 0;一回事其实声明语句有自己独立的规则。4. 经典练习题里藏着的优先级陷阱4.1 九九乘法表里的循环条件与短路逻辑九九乘法表几乎是每个 C 语言初学者第一次写双重循环的题目。大多数人写的是for (int i 1; i 9; i) { for (int j 1; j i; j) { printf(%d*%d%-3d, j, i, i * j); } printf(\n); }这两个循环条件只有关系运算符没有混用所以不需要考虑优先级。但如果你在循环里加了额外判断比如打印到某个条件就终止问题就来了for (int i 0; i 10 ch ! \n; i) { // 这里 的优先级低于 和 ! // 所以等价于 (i 10) (ch ! \n) }虽然不加括号也能正确解析但因为是逻辑与关系混用我强烈建议写成(i 10) (ch ! \n)防止阅读代码的人反复确认优先级。类似地判断字符是否为大写字母时if (ch A ch Z) { }这里的结构也是关系比较先算、逻辑与后算符合直觉。可如果你把换成按位与那又是一个大坑ch A ch Z会先分别算出两个 0/1 值再做按位与结果虽然和往往一致但风格极差而且没有短路语义两边都会执行。写代码时别为了省一个字符把改成。4.2 冒泡排序中的比较和交换冒泡排序的交换动作看着简单其实也是一个优先级教育的绝佳现场for (int i 0; i n - 1; i) { for (int j 0; j n - 1 - i; j) { if (arr[j] arr[j 1]) { int tmp arr[j]; arr[j] arr[j 1]; arr[j 1] tmp; } } }很多初学者把arr[j] arr[j 1]写成arr[j] arr[j 1]这是把比较运算符写成了赋值运算符。逻辑上if条件里需要一个 0/1 值赋值表达式也能产生值所以编译器不会报错但 arr[j] 已经被改成 arr[j1]排序结果乱七八糟。这一类错误不是优先级问题而是符号本身写错但排查起来非常容易误判成优先级导致条件失效。如果写成arr[j] arr[j 1]冒泡排序也可用但会多做不必要的交换破坏稳定性语义。这里的和属于同一优先级结合性也相同没有解析歧义纯粹是算法意图的选择。我见过有人把交换三行改成所谓优化版arr[j] ^ arr[j 1] ^ arr[j] ^ arr[j 1];这一行代码包含未定义行为前面已经说过。即使能跑也只在特定优化级别下碰巧正确。排序本身的复杂度没有因为去掉 tmp 而改善反而增加了挂掉的风险。学习阶段老老实实写临时变量。4.3 位运算交换变量x ^ y ^ x ^ y是个坑前面提到x ^ y ^ x ^ y是未定义行为我再从优先级和结合性角度拆一下。赋值类复合运算符从右往左结合所以它先处理最右边的x ^ y再往左最终在整个表达式结束前 x 被写入了多次这在 C 标准里直接就是 UB不需要具体讨论数值。有些人会狡辩说我跑出来结果是对的。没错在某个编译器、某个优化级别下它可能表现出期望的结果但这不代表代码正确。标准未定义行为意味着编译器完全可以把这段代码优化成任何东西甚至让它什么都不做。换一个版本换一个优化选项结果就变了你还没处说理。正规的交换写法就该是int tmp x; x y; y tmp;如果确实想用异或避免临时变量至少要在明确只有两个变量且不可能指向同一个地址的场景下写成三条独立语句并在注释里说明前提条件。即便如此我也不推荐。现代 CPU 上用一个局部临时变量通常是最高效的因为编译器会把它优化到寄存器里根本不会产生多余内存访问。4.4 鞍点问题里的 if 条件优先级鞍点问题是不少学校 C 语言课的经典矩阵题一个二维数组中的某个元素既是所在行的最大又是所在列的最小。核心判断通常是if (row_max col_min) { // 找到鞍点 }这里常见的坑是在if条件里把写成。一旦写成if (row_max col_min) { }赋值表达式的结果是 col_min 的值只要它不是 0条件就成立整个逻辑完全跑偏。这比优先级问题更常见也比不知道优先级更容易被忽视因为编译不会报错程序也不会崩溃就是结果不对。在实现鞍点问题时还可能遇到嵌套下标与取地址混用的场景scanf(%d, matrix[i][j]);[]优先级高于所以这个表达式的语义是先取 matrix[i][j]再取地址这正好是 scanf 需要的。如果写成matrix[i, j]那是把逗号运算符混进了下标实际是matrix[j]的地址已经不是你想要的元素。这种错误特别隐蔽因为代码看起来都很像但一个是二维数组的一个元素一个是一维数组的一行。5. 记忆口诀与防错习惯5.1 分层记忆法从括号到逗号只有四段完整优先级表有十几行死记硬背很容易忘。我习惯把它压缩成四段来记。第一段是括号、下标、成员访问、函数调用这是一切表达式的最高统治者。第二段是单目运算符包括取地址、解引用、自增自减、逻辑非、按位取反、sizeof、强制类型转换它们从右往左结合。第三段是双目运算符按一级级降低的顺序算术、移位、关系、相等、位与、位异或、位或、逻辑与、逻辑或。这里有个好记的细节位运算里高于^高于|逻辑运算里高于||。第四段是三目、赋值、逗号它们基本处于表达式体系的最底层其中三目和赋值还是右结合。如果你只记住了括号、单目、算术、移位、关系、相等、位、逻辑、条件、赋值、逗号这一个大顺序就已经能应付九成以上的实际场景。遇到实在拿不准的组合先加括号让编译器闭嘴也比记错了强。5.2 写代码时的三个防错习惯第一个习惯是复杂表达式一律加括号。判断位运算、逻辑运算和关系运算混写时不要省那两对括号。多写几个括号不会让代码变慢编译器会视情况优化掉却能让读代码的人少进一次 debug。第二个习惯是长表达式拆开写。一行里既有函数调用又有多个运算符看起来是很炫但排查问题时极难定位。我一般把一个赋值动作拆成两步先算子表达式再赋给中间变量最后组合。这样每个中间结果的数值都可以独立打印确认。第三个习惯是审代码时重点扫和。凡是if条件里出现单个等号先停下来确认意图。尤其是在while ((c getchar()) ! EOF)这种写法里内外两层括号都有特定含义少一层就会变成不同的代码。很多人把这归为低级错误但实际生产环境中它出现的频率相当高。5.3 编译器警告与调试器排查优先级问题编译器其实可以帮你提前拦住很多优先级错误。用 gcc 编译时可以加这两个参数gcc -Wall -Wparentheses program.c -o program-Wall会打开绝大多数警告-Wparentheses专门检查那些你可能误解了优先级的写法。比如if (a b c)gcc 会给出类似 suggest parentheses around comparison in operand of 的提示。看到这个警告哪怕你觉得代码没问题也说明编译器认为解析结果和你预期可能不同去加括号总没错。有些团队直接把-Werror加上让这类警告变成编译错误强制大家修掉。如果编译期没拦下来程序运行结果不对我会先用 gdb 打断点看中间值。比如怀疑x y 0出了问题就在这一行之前分别打印x y和y 0的值很快就能判断出编译器到底按哪种方式解析。调试器和编译器警告配合使用比自己盯着代码猜优先级快得多。最后说一点个人体会。这些年我见过的所有优先级 bug 里九成不是不知道优先级而是太相信自己的脑子里那一套解析规则。一行表达式写下来你觉得没问题但编译器有它自己的读法优先级、结合性、求值顺序是三件不同的事。我不会去背那张表的每个位置但我永远记得三件事单目高于所有双目双目里算术、移位、关系、相等、位、逻辑、赋值逐级降低赋值和条件从右往左。剩下的交给括号。只要保证每一行代码即使删掉所有括号也读得没错优先级 bug 就基本和你无缘了。

相关新闻

Calico FV 测试证书体系全解析:从 cfssl 生成到 k8s 测试基础设施挂载

Calico FV 测试证书体系全解析:从 cfssl 生成到 k8s 测试基础设施挂载

网络云原生网络安全 【免费下载链接】calico Cloud native networking and network security 项目地址: https://gitcode.com/gh_mirrors/cal/calico 点击查看 免费下载 本文围绕 Calico 仓库中 hack/test/certs/README.md 所描述的 FV(Feature Validat…

2026/10/10 22:43:26 阅读更多 →
MATLAB向量完全指南:从创建、索引到运算与排错

MATLAB向量完全指南:从创建、索引到运算与排错

这期继续更MATLAB基础学习笔记,主题是向量。前两篇分别把基本操作和矩阵、数组的概念理了一遍,这次专门把向量单独拎出来聊,原因是很多初学者在真正动手写脚本时,第一个卡住的地方往往不是矩阵操作,而是“向量到底该怎…

2026/10/10 22:42:25 阅读更多 →
WMS系统架构与高并发库存一致性实战指南

WMS系统架构与高并发库存一致性实战指南

简介:本资源是一份面向制造业企业IT部门、物流系统实施顾问及WMS项目管理人员的《WMS数字化仓储物流(成品库)建设方案》完整PPT汇报材料,聚焦解决传统成品库设备陈旧、信息化水平低、人工成本高等核心痛点。方案覆盖项目背景与目标…

2026/10/10 22:42:25 阅读更多 →

最新新闻

BFO-XGBoost超参数优化:Matlab实现与避坑指南

BFO-XGBoost超参数优化:Matlab实现与避坑指南

简介:本资源面向计算机、电子信息工程、数学等专业的大学生及算法初学者,提供一套基于鳑鲏鱼优化算法(BFO)优化XGBoost的分类预测完整方案,可用于课程设计、期末大作业或毕业设计。压缩包共18个文件,约53.6…

2026/10/10 23:29:04 阅读更多 →
LSTM+Transformer混合模型实战:原理、代码与避坑全解析

LSTM+Transformer混合模型实战:原理、代码与避坑全解析

简介:面向时间序列预测学习者的一份LSTM与Transformer混合建模实战资源,定位于帮助读者掌握用深度学习组合模型处理非线性时序数据的完整流程。压缩包共13个文件,包含Python训练脚本、CSV格式的数据集、需求说明文档、预测结果对比图以及IDE辅…

2026/10/10 23:29:04 阅读更多 →
Word高效使用指南:公式冲突、文献插入与格式转换全攻略

Word高效使用指南:公式冲突、文献插入与格式转换全攻略

1. 先解决公式插入的"神仙打架":AxMath、MathType与Word自带公式打开Word写理工科论文,最让人头大的往往不是内容本身,而是公式编辑器。你在搜索引擎里搜"为什么电脑里同时安装了AxMath和MathType,在Word内用AxMat…

2026/10/10 23:29:04 阅读更多 →
ModuleNotFoundError: No module named ‘torchaudio‘ 的成因与修复策略

ModuleNotFoundError: No module named ‘torchaudio‘ 的成因与修复策略

你正在做语音数据处理或者跑一个开源AI项目,环境都配好了,pip install也执行得很顺利,结果一运行代码,屏幕啪地甩出一行红字:ModuleNotFoundError: No module named torchaudio这一行字我太熟了,做Python开…

2026/10/10 23:29:03 阅读更多 →
扩展卡尔曼与无迹卡尔曼滤波:电力系统动态状态估计实战解析

扩展卡尔曼与无迹卡尔曼滤波:电力系统动态状态估计实战解析

电力系统状态估计从“静态断面”走向“动态过程”,正在成为调度自动化里越来越绕不开的一项技术。尤其是同步相量量测单元(PMU)普及之后,量测数据的时间分辨率从秒级提升到几十毫秒级,如果仍然用传统的加权最小二乘静态…

2026/10/10 23:29:03 阅读更多 →
红外目标检测数据集:格式转换与YOLO训练避坑指南

红外目标检测数据集:格式转换与YOLO训练避坑指南

简介:YOLO红外多目标检测数据集面向目标检测学习与算法验证场景,提供1000张真实场景高质量红外图片,经LabelImg标注后附带voc(xml)、coco(json)、yolo(txt)三种格式标签,分别存放于独立文件夹,并确保标注框质量较高&am…

2026/10/10 23:28:02 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

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

2026/10/10 11:14:25 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

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

2026/10/10 1:36:08 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

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

2026/10/10 11:14:58 阅读更多 →

月新闻

我发现了一个新思路:用 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/10 5:23:50 阅读更多 →
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/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练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/10 10:38:42 阅读更多 →