在由代码构筑的坚硬世界里,常识常如隙间微尘般被忽略。这里无意追逐轰鸣的技术洪流,只愿成为一片悄然生长的数字苔藓——以湿润的耐心,厘清 「指针」 如何穿梭于数据的森林;以绵密的网络,梳理 「线程」 如何交织成并发的河流;以安静的覆盖,诠释一段 「循环」 如何成为所有自动化的最初呼吸。
我们收集那些被低估的“理所当然”,梳理那些似懂非懂的“基础概念”。就像苔藓改变地貌并非依靠强力,而是凭借沉默的渗透与覆盖。这些微不足道的认知,终将在时间中沉淀为你心智的肥沃层,让更宏大的创造得以生根。
区分 i++ 与 ++i 的幽微之处
在 C、C++、Java、JavaScript、C# 乃至 PHP 的编程血脉里,自增与自减都是基础而普遍的语法。正因它们遍布如此广泛,其细微差异才更值得厘清——毕竟,真正的困惑往往来自那些“看似熟悉、实则模糊”的常识。
一个典型的混淆场景:赋值
1 | //cpp |
这里的核心是 “时机”:在赋值语句里,a++ 是 “先交付旧值,再自己悄悄加一”;++a 则是 “自己先加一,然后自信地交付新值”。
基于此,我们总结出这份小而确定的规律:
两者的差异,在以下场景会显现:
//js,cpp,Java等等
- 立即赋值(
let x = a++) - 立即打印或参与运算(
console.log(a++)) - 作为数组索引(
arr[i++]) - 在
return语句中 - 在条件判断里(
while(i++ < 5))
两者的效果,在以下场景完全相同:
- 在循环的增量部分单独使用(
for(...; ...; i++)) - 单独写一整行(
i++;) - 作为不关心其返回值的函数参数(
func(i++))
下次你若感到犹豫,可以这样推导:我需要的是它此时此刻的值(旧值),还是它下一时刻的值(新值)? 若需要此刻,选 i++;若需要下一刻,选 ++i。
当然,你完全可以只记住这个最朴素的规律:当它们被立刻使用时,前缀(++i)先变后用,后缀(i++)先用后变。或者,在任何不确定的时候,写一小段代码亲自验证——这本身,就是“数字苔藓”所鼓励的,最扎实的生长方式。