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

本文探讨了两种不常见的编码习惯:if(CONST==value)而非if(value==CONST),以及for(i=MAX-1;i>=0;i--)而非for(i=0;i<MAX;i++)。这两种习惯分别在防止逻辑错误和提高循环效率方面具有潜在优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值