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

时间: 2024-10-29 23:29:42

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

求教:下面的代码中为何手动抛出异常

问题描述 求教:下面的代码中为何手动抛出异常 栈的pop方法,我们这样写:int pop(){ return array[top--];}然后我看jdk源代码,写法相当于:int pop(){ if(top<0)throw new ArrayIndexOutOfBoundsException(); return array[top--];}然而即使没有增加的那句话,当top等于-1时,Java运行环境仍然会自动帮我们抛出ArrayIndexOutOfBoundsException,那么还要自己手

基本线程同步(四)在同步代码中使用条件

在同步代码中使用条件 在并发编程中的一个经典问题是生产者与消费者问题,我们有一个数据缓冲区,一个或多个数据的生产者在缓冲区存储数据,而一个或多个数据的消费者,把数据从缓冲区取出. 由于缓冲区是一个共享的数据结构,我们必须采用同步机制,比如synchronized关键字来控制对它的访问.但是我们有更多的限制因素,如果缓冲区是满的,生产者不能存储数据,如果缓冲区是空的,消费者不能取出数据. 对于这些类型的情况,Java在Object对象中提供wait(),notify(),和notifyAll()

android-在代码中加入TDCollateJSon

问题描述 在代码中加入TDCollateJSon 刚把工程从TouchDB 移动到 CouchBase Lite.代码编译时报错: 2396-2456/com.pivot88.android.manager I/dalvikvm: Rejecting re-init on previously-failed class Lcom/couchbase/touchdb/TDCollateJSON; v=0x0 2396-2415/com.pivot88.android.manager D/chrom

c++-C#与C++位图保存方式的区别是什么?如何将C#中位图buffer正确传到C++代码中?求大神指导

问题描述 C#与C++位图保存方式的区别是什么?如何将C#中位图buffer正确传到C++代码中?求大神指导 C#中位图保存方式与C++中位图保存方式的区别是什么?如何将C#中位图buffer正确传到C++代码中?求大神指导 解决方案 C++中位图分为32/24/16位的三种位图数据存储方式,很多时候C++中主要使用32位和24位,如果你没有特别声明的话.C#中的位图 也多数是32位的.这些所谓的32位或者24位说的是位图中一个像素用多少位来表示,一个像素一般包含RGB三基色,也就是红(red)

android-从 HTML 代码中创建表格

问题描述 从 HTML 代码中创建表格 <table style="width: 560px; border: 2px solid #fee3cc; font-size: 1em;" rules="all" border="1" cellpadding="5" cellspacing="0"> <tbody> <tr> <td> <p>Bharat

qtcreator-Qt导出word文档,如何在代码中设置文档内容的样式?

问题描述 Qt导出word文档,如何在代码中设置文档内容的样式? RT.网上查了一下,基本都是用模板+书签的方法来插入内容,但是我现在想直接靠运行程序来生成一个文档,但是这就有一个问题,文档内容的格式就得写在代码之中,而不能像书签那样把格式定好了直接插内容就行.各位大神知道怎么弄吗? 解决方案 一样的,可以对Selection应用段落样式来实现.具体可以在word中录制一个宏,然后根据自动产生的VB代码照着写.

android 在代码中如何设置 根视图的宽高?

问题描述 android 在代码中如何设置 根视图的宽高? android 在代码中如何设置 根视图的宽高? 如何设置视图container的宽高? public void popEdit(EditText _edit) { // edit=_edit; LinearLayout container=new LinearLayout(cont); container.setOrientation(LinearLayout.HORIZONTAL); LinearLayout.LayoutParam

struts2 cssclass:Struts2 checkboxlist标签 设置cssClass属性生成的html代码中check没有class属性问题

使用struts2 checkboxlist标签设置cssClass属性后,发现生成的html代码中 input 标签并没有class属性.打开checkboxlist.ftl看,内容如下:<input type="checkbox" name="${parameters.name?html}" value="${itemKeyStr?html}" id="${parameters.name?html}-${itemCount}&

在asp.net的后置代码中写入javascript语句,防止提示框背景变白

一般,当我们在网页中弹出类似于msgbox的提示信息时,背景页面都是白色的,这样看起来很不爽例如:怎么解决这个问题?可以在asp.net的后置代码中写入javascript语句,防止背景变白 if (code!=rightCode ){Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script language="javascript" defer>al