其实,这里要说的并不是什么“逆向思维”,而是一些与大多数人的编码习惯相反的“非常规”写法。
if (value == CONST) 还是 if (CONST == value) ?
前者是大多数人、大多数开源代码、教科书、等等的写法。比较符合人的思维方式,看上去很自然。
而后者却被人提出,因为它具体优于前者的地方。如果你误把“==”写作“=”的话(如果编码时比较马虎,这还是容易犯的),后一种写法,编译器会给出一个error;而前一种,编译器只会给出warning,以至于错误可能被隐藏到“运行时”。
我个人还是比较推崇前一种写法,因为看上去顺眼。如果说这样写可能造成把笔误(“==”写作“=”)带到“运行时”的话?我认为这并不是写法的问题,而是不重视warning带来的问题。编译器已经警告你了,为什么置之不理呢?
for (i=0; i<MAX; i++) 还是 for (i=MAX-1; i>=0; i--) ?
同样,前者是符合习惯的写法。而后者却被人提出,因为它可能具有性能上的优势。
前一种写法是将i和MAX比较,每次比较需要执行一次CMP(或类似)指令,该指令会在CPU中设置FLAG。然后再执行一条指令去检查FLAG,以便确定比较结果;
而后一种写法将i和0比较,CMP指令可能可以省略掉。因为i--的时候,如果i减为0、或者符号有变化、等等情况下,CPU中的FLAG会顺便被设置。这时候,比较i和0的话可能只需要直接看标志位就行了。
但是,尽管如此,我个人还是比较推崇前一种写法,因为看上去顺眼。把i和0比较仅仅是提供了被优化的可能性,编译器却未必就能实现优化(即使打开了优化选项)。并且,就算优化了,执行效率的提升也是很有限的(一条CMP指令而已)。如果真的这么渴望优化的话,倒不如把for循环展开得了,就像xmemcpy所做的那样……