Digital Moss

在由代码构筑的坚硬世界里,常识常如隙间微尘般被忽略。这里无意追逐轰鸣的技术洪流,只愿成为一片悄然生长的数字苔藓——以湿润的耐心,厘清 「指针」 如何穿梭于数据的森林;以绵密的网络,梳理 「线程」 如何交织成并发的河流;以安静的覆盖,诠释一段 「循环」 如何成为所有自动化的最初呼吸。

我们收集那些被低估的“理所当然”,梳理那些似懂非懂的“基础概念”。就像苔藓改变地貌并非依靠强力,而是凭借沉默的渗透与覆盖。这些微不足道的认知,终将在时间中沉淀为你心智的肥沃层,让更宏大的创造得以生根。


区分 i++ 与 ++i 的幽微之处

在 C、C++、Java、JavaScript、C# 乃至 PHP 的编程血脉里,自增与自减都是基础而普遍的语法。正因它们遍布如此广泛,其细微差异才更值得厘清——毕竟,真正的困惑往往来自那些“看似熟悉、实则模糊”的常识。
一个典型的混淆场景:赋值

1
2
3
4
5
6
//cpp
int a = 1;
int b = a++; // 先赋值,后自增(b得到1,然后a变为2)

int a = 1;
int b = ++a; // 先自增,后赋值(a先变为2,b得到2)

这里的核心是 “时机”:在赋值语句里,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++)先用后变。或者,在任何不确定的时候,写一小段代码亲自验证——这本身,就是“数字苔藓”所鼓励的,最扎实的生长方式。