关于C代码中的“逆向思维”

简介:

其实,这里要说的并不是什么“逆向思维”,而是一些与大多数人的编码习惯相反的“非常规”写法。

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所做的那样……


目录
相关文章
|
算法 C语言
【辗转相除法简析】 +【C语言代码运用】
【辗转相除法简析】 +【C语言代码运用】
415 0
【辗转相除法简析】 +【C语言代码运用】
|
7月前
|
算法 C语言
约瑟夫环的C语言和86/88汇编非递归算法
约瑟夫环的C语言和86/88汇编非递归算法
73 0
|
算法 C语言
【零钱问题】C语言贪心算法分析(文末彩蛋)
【零钱问题】C语言贪心算法分析(文末彩蛋)
174 0
|
7月前
|
算法 搜索推荐 程序员
C语言第三十练——递归求解1+2+……+n
C语言第三十练——递归求解1+2+……+n
172 1
|
7月前
|
算法 搜索推荐 程序员
C语言第三十一练——递归求解n位斐波那契数列
C语言第三十一练——递归求解n位斐波那契数列
50 0
|
算法 C语言
KMP算法详解(理论+C语言代码实现)(下)
KMP算法详解(理论+C语言代码实现)(下)
|
算法 C语言
KMP算法详解(理论+C语言代码实现)(上)
KMP算法详解(理论+C语言代码实现)
149 0
|
存储 算法 搜索推荐
C语言实现拓扑排序和关键路径
C语言实现拓扑排序和关键路径
117 1
C语言实现拓扑排序和关键路径
|
算法
【每日挠头算法题】Acwing 756. 蛇形矩阵 —— 巧妙解法
【每日挠头算法题】Acwing 756. 蛇形矩阵 —— 巧妙解法
146 0
【每日挠头算法题】Acwing 756. 蛇形矩阵 —— 巧妙解法
|
C语言
C语言典型例题五——百元买百鸡
百元买百鸡 题目:公鸡一个五块钱,母鸡一个三块钱,小鸡三个一块钱,现在要用一百块钱买一百只鸡,问公鸡、母鸡、小鸡各多少只?
163 0