1、指針:
對于大部分的編譯器,使用指針比使用數組生成的代碼更短,執(zhí)行效率更高。但是在Keil中則相反,使用數組比使用的指針生成的代碼更短。通常使用自加、自減指令和復合賦值表達式(如a-=1及a+=1等)都能夠生成高質量的程序代碼,編譯器通常都能夠生成inc和dec之類的指令,而使用a=a+1或a=a-1之類的指令,有很多C編譯器都會生成二到三個字節(jié)的指令
2、求余運算:
a=a%8; --> a=a&7;
說明:位操作只需一個指令周期即可完成,而大部分的C編譯器的“%”運算均是調用子程序來完成,代碼長、執(zhí)行速度慢。通常,只要求是求2n方的余數,均可使用位操作的方法來代替。
3、平方運算 :
a=pow(a,2.0); --> a=a*a;
說明:在有內置硬件乘法器的單片機中(如51系列),乘法運算比求平方運算快得多因為浮點數的求平方是通過調用子程序來實現的,在自帶硬件乘法器的AVR單片機中,如ATMega163中,乘法運算只需2個時鐘周期就可以完成。既使是在沒有內置硬件乘法器的AVR單片機中,乘法運算的子程序比平方運算的子程序代碼短,執(zhí)行速度快。
如果是求3次方,如:a=pow(a,3.0); --> a=a*a*a; 則效率的改善更明顯。
4、乘法和除法:
a=a*4; --> a=a<<2;
b=b/4; --> b=b>>2;
實際上,只要是乘以或除以一個整數,均可以用移位的方法得到結果,如:
a=a*9 --> a=(a<<3)+a
5、延時函數:
通常使用的延時函數均采用自加的形式:
void delay (void)
{
unsigned int i;
for (i=0;i<1000;i++)
;
}
將其改為自減延時函數
void delay (void)
{
unsigned int i;
for (i=0;i<1000;i--)
;
}
兩個函數的延時效果相似,但幾乎所有的C編譯對后一種函數生成的代碼均比前一種代碼少1~3個字節(jié),因為幾乎所有的MCU均有為0轉移的指令,采用后一種方式能夠生成這類指令。
6、while循環(huán)和do…while循環(huán)
在這兩種循環(huán)中,使用do…while循環(huán)編譯后生成的代碼的長度短于while循環(huán)。寫好C語言,漂亮的宏定義很重要,使用宏定義可以防止出錯,提高可移植性,可讀性,方便性等等。