① C語言中有哪些實用的編程技巧
這篇文章主要介紹了C語言高效編程的幾招小技巧,本文講解了以空間換時間、用數學方法解決問題以及使用位操作等編輯技巧,並給出若干方法和代碼實例,需要的朋友可以參考下
引言:
編寫高效簡潔的C語言代碼,是許多軟體工程師追求的目標。本文就工作中的一些體會和經驗做相關的闡述,不對的地方請各位指教。
第1招:以空間換時間
計算機程序中最大的矛盾是空間和時間的矛盾,那麼,從這個角度出發逆向思維來考慮程序的效率問題,我們就有了解決問題的第1招——以空間換時間。
例如:字元串的賦值。
方法A,通常的辦法:
代碼如下:
#define LEN 32
char string1 [LEN];
memset (string1,0,LEN);
strcpy (string1,「This is a example!!」);
方法B:
代碼如下:
const char string2[LEN] =「This is a example!」;
char * cp;
cp = string2 ;
(使用的時候可以直接用指針來操作。)
從上面的例子可以看出,A和B的效率是不能比的。在同樣的存儲空間下,B直接使用指針就可以操作了,而A需要調用兩個字元函數才能完成。B的缺點在於靈 活性沒有A好。在需要頻繁更改一個字元串內容的時候,A具有更好的靈活性;如果採用方法B,則需要預存許多字元串,雖然佔用了大量的內存,但是獲得了程序 執行的高效率。
如果系統的實時性要求很高,內存還有一些,那我推薦你使用該招數。
該招數的變招——使用宏函數而不是函數。舉例如下:
方法C:
代碼如下:
#define bwMCDR2_ADDRESS 4
#define bsMCDR2_ADDRESS 17
int BIT_MASK(int __bf)
{
return ((1U << (bw ## __bf)) - 1) << (bs ## __bf);
}
void SET_BITS(int __dst, int __bf, int __val)
{
__dst = ((__dst) & ~(BIT_MASK(__bf))) | /
(((__val) << (bs ## __bf)) & (BIT_MASK(__bf))))
}
SET_BITS(MCDR2, MCDR2_ADDRESS, RegisterNumber);
方法D:
代碼如下:
#define bwMCDR2_ADDRESS 4
#define bsMCDR2_ADDRESS 17
#define bmMCDR2_ADDRESS BIT_MASK(MCDR2_ADDRESS)
#define BIT_MASK(__bf) (((1U << (bw ## __bf)) - 1) << (bs ## __bf))
#define SET_BITS(__dst, __bf, __val) /
((__dst) = ((__dst) & ~(BIT_MASK(__bf))) | /
(((__val) << (bs ## __bf)) & (BIT_MASK(__bf))))
SET_BITS(MCDR2, MCDR2_ADDRESS, RegisterNumber);
函數和宏函數的區別就在於,宏函數佔用了大量的空間,而函數佔用了時間。大家要知道的是,函數調用是要使用系統的棧來保存數據的,如果編譯器里有棧檢查 選項,一般在函數的頭會嵌入一些匯編語句對當前棧進行檢查;同時,CPU也要在函數調用時保存和恢復當前的現場,進行壓棧和彈棧操作,所以,函數調用需要 一些CPU時間。而宏函數不存在這個問題。宏函數僅僅作為預先寫好的代碼嵌入到當前程序,不會產生函數調用,所以僅僅是佔用了空間,在頻繁調用同一個宏函 數的時候,該現象尤其突出。
D方法是我看到的最好的置位操作函數,是ARM公司源碼的一部分,在短短的三行內實現了很多功能,幾乎涵蓋了所有的位操作功能。C方法是其變體,其中滋味還需大家仔細體會。
第2招:數學方法解決問題
現在我們演繹高效C語言編寫的第二招——採用數學方法來解決問題。
數學是計算機之母,沒有數學的依據和基礎,就沒有計算機的發展,所以在編寫程序的時候,採用一些數學方法會對程序的執行效率有數量級的提高。
舉例如下,求 1~100的和。
方法E
代碼如下:
int I , j;
for (I = 1 ;I<=100; I ++){
j += I;
}
方法F
代碼如下:
int I;
I = (100 * (1+100)) / 2
這個例子是我印象最深的一個數學用例,是我的計算機啟蒙老師考我的。當時我只有小學三年級,可惜我當時不知道用公式 N×(N+1)/ 2 來解決這個問題。方法E循環了100次才解決問題,也就是說最少用了100個賦值,100個判斷,200個加法(I和j);而方法F僅僅用了1個加法,1 次乘法,1次除法。效果自然不言而喻。所以,現在我在編程序的時候,更多的是動腦筋找規律,最大限度地發揮數學的威力來提高程序運行的效率。
第3招:使用位操作
實現高效的C語言編寫的第三招——使用位操作,減少除法和取模的運算。
在計算機程序中,數據的位是可以操作的最小數據單位,理論上可以用「位運算」來完成所有的運算和操作。一般的位操作是用來控制硬體的,或者做數據變換使用,但是,靈活的位操作可以有效地提高程序運行的效率。舉例如下:
方法G
代碼如下:
int I,J;
I = 257 /8;
J = 456 % 32;
方法H
int I,J;
I = 257 >>3;
J = 456 - (456 >> 4 << 4);
在字面上好像H比G麻煩了好多,但是,仔細查看產生的匯編代碼就會明白,方法G調用了基本的取模函數和除法函數,既有函數調用,還有很多匯編代碼和寄存 器參與運算;而方法H則僅僅是幾句相關的匯編,代碼更簡潔,效率更高。當然,由於編譯器的不同,可能效率的差距不大,但是,以我目前遇到的MS C ,ARM C 來看,效率的差距還是不小。相關匯編代碼就不在這里列舉了。
運用這招需要注意的是,因為CPU的不同而產生的問題。比如說,在PC上用這招編寫的程序,並在PC上調試通過,在移植到一個16位機平台上的時候,可能會產生代碼隱患。所以只有在一定技術進階的基礎下才可以使用這招。
第4招:匯編嵌入
高效C語言編程的必殺技,第四招——嵌入匯編。
「在熟悉匯編語言的人眼裡,C語言編寫的程序都是垃圾」。這種說法雖然偏激了一些,但是卻有它的道理。匯編語言是效率最高的計算機語言,但是,不可能靠著它來寫一個操作系統吧?所以,為了獲得程序的高效率,我們只好採用變通的方法 ——嵌入匯編,混合編程。
舉例如下,將數組一賦值給數組二,要求每一位元組都相符。
代碼如下:
char string1[1024],string2[1024];
方法I
代碼如下:
int I;
for (I =0 ;I<1024;I++)
*(string2 + I) = *(string1 + I)
方法J
代碼如下:
#ifdef _PC_
int I;
for (I =0 ;I<1024;I++)
*(string2 + I) = *(string1 + I);
#else
#ifdef _ARM_
__asm
{
MOV R0,string1
MOV R1,string2
MOV R2,#0
loop:
LDMIA R0!, [R3-R11]
STMIA R1!, [R3-R11]
ADD R2,R2,#8
CMP R2, #400
BNE loop
}
#endif
方法I是最常見的方法,使用了1024次循環;方法J則根據平台不同做了區分,在ARM平台下,用嵌入匯編僅用128次循環就完成了同樣的操作。這里有 朋友會說,為什麼不用標準的內存拷貝函數呢?這是因為在源數據里可能含有數據為0的位元組,這樣的話,標准庫函數會提前結束而不會完成我們要求的操作。這個 常式典型應用於LCD數據的拷貝過程。根據不同的CPU,熟練使用相應的嵌入匯編,可以大大提高程序執行的效率。
雖然是必殺技,但是如果輕易使用會付出慘重的代價。這是因為,使用了嵌入匯編,便限制了程序的可移植性,使程序在不同平台移植的過程中,卧虎藏龍,險象環生!同時該招數也與現代軟體工程的思想相違背,只有在迫不得已的情況下才可以採用。切記,切記。
② 高級語言的編譯過程,經過哪幾個步驟
開發C程序有四個步驟:編輯、編譯、連接和運行。
任何一個體系結構處理器上都可以使用C語言程序,只要該體系結構處理器有相應的C語言編譯器和庫,那麼C源代碼就可以編譯並連接到目標二進制文件上運行。
1、預處理:導入源程序並保存(C文件)。
2、編譯:將源程序轉換為目標文件(Obj文件)。
3、鏈接:將目標文件生成為可執行文件(EXE文件)。
4、運行:執行,獲取運行結果的EXE文件。
(2)編譯程序的開發技巧擴展閱讀:
將C語言代碼分為程序的幾個階段:
1、首先,對源代碼文件進行測試。以及相關的頭文件,比如Stdio。H.CPP預處理為。我的文件。預編譯。該文件不包含任何宏定義,因為所有宏都已展開,且包含的文件已插入。我提起。
2、編譯過程是對預處理後的文件進行詞法分析、語法分析、語義分析和優化,生成相應的匯編代碼文件。這個過程通常是整個程序的核心部分,也是最復雜的過程之一。
3、匯編程序不直接輸出可執行文件,而是輸出目標文件。匯編程序可以調用LD來生成可運行的可執行程序。也就是說,您需要鏈接到大量文件以獲得最終可執行文件「a.out」。
4、在鏈接過程中,其他目標文件中定義的函數調用指令需要重新調整,而其他目標文件中定義的變數也存在同樣的問題。
③ C語言程序開發的四個步驟是什麼
1 寫代碼。
2 編譯。
3 鏈接。
4 運行。
C語言設計的三個步驟:
一、分析問題
二、畫出問題的基本輪廓
三、實現該程序
計算機語言包括機器語言、匯編語言、高級語言。機器語言是用二進制代碼表示的計算機能直接識別和執行的一種機器指令的集合。它是計算機的設計者通過計算機的硬體結構賦予計算機的操作鉛隱功能,比如匯編語言(assembly language)。機器語言具有靈活、直接執行和速度快等特點。高級語言比較容易識記和理解,像C B語言等。
輸入與編輯源程序--對源程序進行編譯--與庫函數連接--運行可執行的目標程序。
提供《計算機考試題庫》的答案(填空):
開發—個C語言程序需要經過______、______、______和______四個基本過程。
答案:編輯 編譯 連接 運行
擴充解釋:
1. 編輯:編寫源程序代碼(.c、.h文件)
2. 編譯:將源代碼編譯為目標文件(.OBJ文件)
3. 鏈接:將目標文件生成可執行文件( .EXE文件)
4. 運行:執行 .EXE文件,得到運行結果。
四個步驟?第一次聽有人這么說,如果寫很大代碼量的程序的話,那可得幾百行甚至幾千行的代碼,沒什麼具體步驟啊!如果說框架,那一般是
#include<stdio.h><>括弧內是你需要包含的頭文件,是具體悔虛情況而定。
void main()主函數開始,這是都有的,不過也有的是int型的。
{
}
不知道我的答案能不能幫到你!
C語言的原型ALGOL 60語言。(也稱為A語言)1963年,劍橋大學將ALGOL 60語言發展成為CPL(Combined Programming Language)語言。1967年,劍橋大學的Matin Richards 對CPL語言進行了簡化,於是產生了BCPL語言。1970年,美國貝爾實驗室的Ken Thompson將BCPL進行了修改,並為它起了一個有趣的名字「B語言」。意思是將CPL語言煮干,提煉出它的精華。並且他用B語言寫了第一個UNIX操作系統。而在1973年,B語言也給人「煮」了一下,美國貝爾實驗室的D.M.RITCHIE在B語言的基礎上最終設計出了一種新的語言,他取了BCPL的第二個字母作為這種語言的名字,這就是C語言。為了使UNIX操作系統推廣,1977年Dennis M.Ritchie 發表了不依賴於具體機器系統的C語言編譯文本《可移植的C語言編譯程序》。即是著名的ANSI C。1978年Brian W.Kernighian和Dennis M.Ritchie出版了名著《C語言程序》(The C Programming Language),從而使C語言成為當時世界上流行最廣泛的高級程序設計語言。1988年,隨著微型計算機的日益普及, C語言出現了許多版本。由於沒有統一的標准,使得這些C語言之間出現了一些不一致的地方。為了改變這種情況,美國國家標准研究所(ANSI)為C語言制定了一套ANSI標准, 成為現行的C語言標准3.C語言的主要特點 。C語言發展迅速, 而且成為最受歡迎的語言之一, 主要因為它具有強大的功能。許多著名的系統軟體, 如DBASE Ⅲ PLUS、DBASE Ⅳ 都是由C 語言編寫的。用C語言加上一些匯編語言子程序, 就更能顯示C語言的優勢了,象PC- DOS 、WORDSTAR等就是用這種方法編寫的。
1 寫代碼。這是最基礎的一步,即實現C語言的源文件(.c,必需),和可能的頭文件(.h,非必需)。
2 編譯。將編寫好的代碼,通過編譯工具,轉換為目標文件。此步中,會對文件內部及包含的頭文件進行語法語義的分析槐前廳檢查。如果出錯,則必須返回到一步對代碼進行修改,直到沒有錯誤為止。
3 鏈接。將目標文件鏈接成可執行文件。此步會對文件直接的關聯進行檢查。如果出錯需要返回到1修改代碼。直到沒有錯誤。
4 運行。這個是最後一步,也是C語言的最終目的。
5 在運行結果與期望不符時,需要檢查原因,修改代碼,重新執行一二三直到程序沒有問題。
(1)語言簡潔、緊湊靈活。二十八個關鍵字、九種控制語句,程序形式自由,運算符豐富。三十四種運算符。
(2)數據類型豐富,具有現代語言的各種數據結構。
(3)C程序的主要結構是函數,是完全模塊化和結構化的語言。
(4)允許直接訪問物理地址,能進行位操作,能實現匯編語言的大部分功能,可直接對硬體進行操作。兼有高級和低級語言的特點。
(5)程序可移植性好(與匯編語言比)。基本上不做修改就能用於各種型號的計算機和各種操作系統。
(6)目標代碼質量高,程序執行效率高。只比匯編程序生成的目標代碼效率低10%-20%。
(7)語法限制不太嚴格,程序設計自由度大。
安裝CB平台
1、在界面上加一個按鈕控制
2、雙擊按鈕,在游標閃爍處寫入代碼,可以寫C代碼。
C語言不是匯編語言開發的、C語言是在B語言基礎上發展而來的、可以網路
④ 程序開發的四個步驟
1、定義程序目標。在開始寫程序之前,應對希望程序要做什麼有一個清晰的想法。考慮程序需要的信息,程序需要進行的計算和操作,以及程序應該向你報告的信息。在這一規劃階老液段,應該用一般概念來考慮問題,而不是一些具體的計算機語言術語來考慮。
2、設計程序。在對程序需要完成的事情有一個概念性的認識後,就應該決定程序要如何完成它,用戶界面應該是怎麼樣的,程序應該如何組織,目標用戶是誰,有多長的時間來完成實現這個程序等等。
3、編寫代碼。在程序有了清晰的設計後,就可以通過編寫代碼來實現它了。也就是說,將設計構思轉變為C語言。一般來說,需要使用文本編輯器來創建一種稱為源代碼的文件,該文件包含程序設計的C實現形式。
4、編譯源代碼。編譯細節取決於編程環境,編譯器還檢查程序是否為有效的C語言程序。
5、運行程序。一般來說,可執行文件就是打開之後可以直接能夠運行的文件。
6、測試和調試程序。程序能夠正常運行那是極好的,但有時候它也可能運行不正確。因此,應該進行檢查,看程序是否存在錯誤。姿睜
7、維護和修改程序。在為自己或為別人跡含歲創建程序後,該程序可能會有更廣泛的應用。如果是這樣,可能會發現需要對其進行更改,也就是項目的維護和修改。