有一段非常经典的代码,我们来看看:
求平方根倒数
float Q_rsqrt( float number ){ long i; float x2, y; const float threehalfs = 1.5F; x2 = number * 0.5F; y = number; i = * ( long * ) &y; // evil floating point bit level hacking i = 0x5f3759df - ( i >> 1 ); // what the fuck? y = * ( float * ) &i; y = y * ( threehalfs - ( x2 * y * y ) ); // 1st iteration // y = y * ( threehalfs - ( x2 * y * y ) ); // 2nd iteration, this can be removed #ifndef Q3_VM #ifdef __linux__ assert( !isnan(y) ); // bk010122 - FPE? #endif #endif return y; }
这段代码的经典之处除了以非常高效的速度算出来平方根的倒数,还因为其中的一句
wtf 的注释,很明显这个 0x5f3759df
Magic Number
没人知道是干什么的。(有人通过数学公式推导出了这个魔法数字的由来,)。很明显这里的注释明显不足,至少这里要注释上推导过程或者是利用什么数学公式推算的,因为我们并不能保证所有的程序员都有这样的数学功底。
还有一些注释,就是有些开发者喜欢在注释里添加姓名和日期,例如:
// [20180909 Elynn] Bala Bala...
加这种注释一般都是觉得方便以后他人遇到问题知道该和谁讨论,但是事实上,注释放了一年又一年,下一个人修改代码的时候很可能没有加日期和姓名,将来有问题的时候找到第一个加注释的人,他也看不懂为什么改成了这样。为什么没必要加这类注释?因为我们都会有代码版本控制的软件,这是最直接最方便找到修改者的方法,而不是看上面这段不一定准确的注释来找这段代码的开发者。
说到这里,还要顺便说下一种坏注释,那就是错误的注释。误导性的注释比没注释更可怕。当我们修改一个函数的时候,如果函数的最初的注释和最新的实现不匹配,一定记得要修改一下注释,哪怕是删掉注释,也不要留着误导性的注释。