自增(++)和自减(--)的关键在于执行时序:前置(++i/--i)先改值再取值,后置(i++/i--)先取值再改值;混用如i++ + ++i属未定义行为,应避免。

自增(++)和自减(--)不是“多加一行代码”的替代品,而是有明确执行时序的运算符。用对的关键,在于分清“什么时候改值”和“什么时候取值”。
前置和后置的本质区别
前置(如 ++i、--i)是“先改值,再参与后续计算”;后置(如 i++、i--)是“先拿当前值参与计算,再改值”。这个顺序差异在单独使用时看不出来,一旦进入表达式,结果就完全不同。
- int i = 5; int a = ++i; → i 变成 6,a 也等于 6
- int i = 5; int b = i++; → b 等于 5,之后 i 才变成 6
- 同一表达式中混用(如 i++ + ++i)属于未定义行为,不同编译器可能给出不同结果,必须避免
哪些地方适合用前置操作
前置形式天然适配“需要新值立即生效”的场景,逻辑更直接,也不易出错。
- for 循环更新部分:for (int i = 0; i
- 作为函数参数:printf("%d", ++count); 直接输出递增后的值,无需拆成两行
- 指针移动后立即解引用:if ((++ptr)->active) {...} 先跳到下一个元素,再检查其成员
后置操作的典型用途
后置更适合“保留旧值用于当前计算,之后再更新”的逻辑,常见于数组遍历或计数器归档。
- sum += arr[i++]; —— 取出 arr[i] 后,i 自动指向下一个位置
- char *p = str; while (*p++) { ... } —— 判断当前字符是否为 '\0',再移动指针
- 循环中记录上一次状态:prev = i++; 此时 prev 存的是旧值,i 已更新
安全使用的几个习惯
初学阶段容易忽略副作用,养成清晰、保守的习惯能避开多数坑。
- 只对变量使用 ++/--,不能对字面量(如 5++)、表达式(如 (a+b)++)或常量使用
- 浮点型也支持 ++/--(如 double x = 2.1; ++x; → x 变为 3.1),但要注意精度误差累积
- 复杂表达式(如 a = b++ + --c * d++)建议拆解:先改值,再算中间结果,最后赋值
- 单条语句中只对一个变量做一次自增/自减,不写 i++ + i-- 这类组合











