導航:首頁 > 編程語言 > c語言編程技巧分析

c語言編程技巧分析

發布時間:2022-04-17 11:09:48

① 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];方法Iint 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,string1MOV R1,string2MOV R2,#0loop:LDMIA R0!, [R3-R11]STMIA R1!, [R3-R11]ADD R2,R2,#8CMP R2, #400BNE loop}#endif方法I是最常見的方法,使用了1024次循環;方法J則根據平台不同做了區分,在ARM平台下,用嵌入匯編僅用128次循環就完成了同樣的操作。這里有朋友會說,為什麼不用標準的內存拷貝函數呢?這是因為在源數據里可能含有數據為0的位元組,這樣的話,標准庫函數會提前結束而不會完成我們要求的操作。這個常式典型應用於LCD數據的拷貝過程。根據不同的CPU,熟練使用相應的嵌入匯編,可以大大提高程序執行的效率。雖然是必殺技,但是如果輕易可能使用會付出慘重的代價。這是因為,使用了嵌入匯編,便限制了程序的可移植性,使程序在不同平台移植的過程中,卧虎藏龍,險象環生!同時該招數也與現代軟體工程的思想相違背,只有在迫不得已的情況下才可以採用。切記,切記。

·下一條:編程修養

評論
發布者 標題 發布日期
暫沒有任何評論
以下發言只是廣嵌網會員個人意見,非本網立場 查看更多評論

發表評論
·尊重網上道德,遵守中華人民共和國的各項有關法律法規。
·承擔一切因您的行為而直接或間接導致的民事或刑事法律責任。
·本站管理人員有權保留或刪除其管轄留言中的任意內容,本站有權在網站內轉載或引用您的評論。
·參與本評論即表明您已經閱讀並接受上述條款。

標題:
發布者:
內容:
驗證碼:

相關信息
·.Net(C#)開發漫談..
·.Net(C#)開發漫談..
·C#編程實用技巧:輕松實..
·學生管理系統(C原代碼)
·嵌入式智能人機界面與PL..
·嵌入式系統編程中的代碼優..
·C++對象布局及多態實現..
·C和C++裡面的lval..
·C語言平台縮短SoC前期..
·用Visual C++實..

② C語言編程的技巧

請記住,編程編程再編程,每一個小程序都認真思考去完成,學會改程序,讀程序,實踐是檢驗真理的唯一標准

③ C語言編程,求詳細分析,詳細詳細詳細!!

斐波那契數列問題。這個與漢諾塔都屬於來源來生活的比較典型的例子。
題目不難,主要是分析出兔子總數的每個月的變化規律然後編程就會非常簡單了。
表達式為F[n]=F[n-1]+F[n-2](n>=2,F[0]=0,F[1]=1),即前兩項比較特殊,然後從第三項開始,值為前兩項之和。如:0,1,1,2,3,5,8,13,21......
方法有多種,一般用遞歸比較簡單明了。分析寫在注釋里了,有不懂的請追問。
int Fibon1(int n)
{
if (n == 1 || n == 2)
{
return 1; //如果n是1或者2,結果為1。
}
else
{
return Fibon1(n - 1) + Fibon1(n - 2); //如果不是n不是1和2,那麼調用Fibon1函數。
} //直到參數n變為2,即上述變為1+0.
}
int main()
{
int n = 0;
int ret = 0;
scanf("%d", &n);
ret = Fibon1(n); //調用函數(遞歸)
printf("ret=%d", ret);
return 0;
}

④ C語言學習技巧

1、學習C語言,要從入門到精通,需要讀哪些書(從簡單的到難的排序,越詳細越好,最好都能注釋下選擇這本書的理由)?

入門階段:還是老譚那本。
理由:雖然不能說它寫得有多好,但是你現在要做的是入門,要快速的掌握c的基本語法,這本書很好理解,能夠讓你在最短的時間內大致掌握這門語言的概更。

第二階段:《c程序設計語言》(The C Programming Language)和《C語言解惑》(The C puzzle book)
理由:《the c programming language》號稱c語言聖經。其實它也只是一本介紹基礎語法的書,不做入門教程是因為對於初學者來說,它難度稍大,之所以推薦,是因為它能讓你---系統而嚴密的---把C語言知識構架整理一遍。《c語言解惑》,系統的整理了c語法中容易讓你產生迷惑或容易犯錯的地方(如a+++++b等),這時候你才算真正開始學習c語言了.(以上兩本現在出重印了,應該在書店可以買到)

第三階段:《C陷阱與缺陷》(C Traps and Pitfalls)和《高質量c/c++編程指南》
理由:《c陷阱與缺陷》是讓對c的理解有質變得一本書,如如何理解(*(void(*)())0)()等問題,我的感覺是看完這本書讓我真正從小菜鳥變成了老菜鳥。《高質量...》,終於有一本國產的了,呵呵,我認為這本書是把你從土匪變成正規軍的最好指南,該書涉及編程風格、效率、重載、健壯性等一些列之前很難注意的問題。(以上兩本《c陷阱...》已絕版,不過網上可以下載到中英文版,《高質量...》本身就是網路書,很容易找到)

其它推薦書:《c專家編程》《c和指針》

⑤ 在C語言編程中都有哪些技巧呢

1,在控制循環方面你可以定義一個變數true默認是1,並把它作為循環條件,這樣你就可以通過控制true的值去控制你的循環
2,在進行if語句判斷時最好每一個條件加一個()這樣不至於搞混,if語句的內容也最好加上{ },當然你也可以設置一個true變數作為判斷條件,這樣便於控制
3,在函數調用時最好先寫主函數,把子函數寫在主函數的前面這樣可以減少主函數中不必要的代碼,最好多用數組和指針進行函數的條用
4,在用到結構體時最好這樣做 typedef strcut stu{....}Stu 這樣在定義變數的時候你就可以這樣寫
Stu student1;而不必要寫成這樣struct stu student1;而且最好用指針Stu *student1;c語言的靈魂就是指針
5,在指針方面在循環輸出內容時可以這樣寫for(;p!=null;p=p->next)
{
.......
}
這個其實就是鏈表的輸出,記住數組的變數名也是一個指針,比如int a[10]和int *b; b=a
printf("結果%d"a[0]);與printf("結果%d"*b);結果是一樣的其實a[0]與a指向的都是數組的第一個元素

還有在給指針賦值的時候記住賦的是地址,比如int *a ;int b=10; a=&b(正確的) a=b(這是錯誤的)
在指針輸出值得時候前面要加一個*,就告訴你這么多吧,剩下的你自己在編程中自己體驗總結

⑥ C語言編程有哪些技巧

沒什麼捷徑吧,要放棄平時玩的時間,用來看書、看源程序、自己編程序、頭腦不靈活——不存在這樣的說法,只能說你對c語言下的功夫還不夠。你可以去找一些編程論壇,或者像網路知道一類的網站,去回答別人的問題,或者提問、看別人的回答,都能對你有所裨益的。

⑦ c語言編程時有哪些小技巧

多參考別人的優秀的源代碼,試著在自己寫寫代碼熟悉語法和編寫代碼的規則。
要學會自己修改自己的錯誤,在修改的過程中將學會不少的編程經驗。
多用輸入(scanf)和輸出(printf)來調試錯誤的代碼段,就可以很快的找到錯誤的所在。

⑧ 學習C語言的要領和技巧

從最基本的流程學起,從最基本的語句學起。
在學習的過程中,特別注意每個函數的作用,多想想這個函數能怎樣用,用在哪裡,能起到什麼另外的效果!要學會活用!
程序,對數學,特別是邏輯的要求把比較高。
寫好程序,首先對整個程序的流程有縝密的思考,要求周到,准確,先思考,不要急著寫程序!!這一點請注意!也就是說先演算法,先研究程序的結構,是用什麼來實現的,循環?分支?等等。然後再用語言來實現!語言只是編寫程序的工具。所以學語言,先學會程序化的思想。在將演算法翻譯成語言的時候,再結合實際情況,逐步求精,有目的的修改,達到最優化。
我們學院的C語言,很有特色,英文版,考試也是。我想說的就是,外文版的這本書,它在引領一個不懂編程的人,逐步養成程序、流程、邏輯的思想,是非常優秀的一本書。如果能字字句句閱讀,將會很清楚領會到程序的思想。然而,書太厚,生詞太多,時間太短。我的建議是,看某一本中文版的書,一本不夠,看兩本。先盡快學會程序的思想,也就是用程序來想問題,這樣,就會編程了。然後,考試前幾周,背一背生詞、關鍵詞,就可以考試了。如果你堅持要讀外文版,可以,但要跳讀!
然後,還要看你是想只是應付期末考試,還是想學好編程。應付期末考,需要注意書中的重點,也就是考點,這樣就夠了。比如說字元型變數加指針,這樣就夠了,不需要更高級的指針的知識。
而你如果想真正學好程序(我不說C語言是因為我說過C語言只是編寫程序的工具之一),肯定是要打好基礎的!任何一個細節,都是不能放過的!而且,這樣的人往往會很郁悶~因為我們程序真正要求的,考試一般不會涉及到,因為比較難!(不會指針的人,永遠不要說他會C語言!)而考試的內容,恰恰是最無聊的東西,比如格式化輸出printf函數的第一個參數,太繁了,記都記不住。如果學的深的話,只需要知道有這么一個函數,有這么一個功能。而要用的時候,查書就行。可是對考試來說,顯然不行。所以要看看你是哪一種~

⑨ 求C語言編程思想,技巧的心得,體會。

是實現比較兩個數的大小吧,模塊思想就是把步驟挖出來成一個函數
我不單獨寫結果的代碼,再寫個不這樣做的對比下,先來一般的
#include<stdio.h>
int
main()
{
int
a=4,b=3,c;
c=a>b?a:b;
printf("大的個數是:%d",c);
getch();
}
下面是用模塊思想的
#include<stdio.h>
cmp(x,y)
{
return
x>y?x:y;
}
int
main()
{
int
a=4,b=3,c;

c=cmp(a,b);
printf("大的個數是:%d",c);
getch();
}
可以把printf也放進函數里,具體要放些什麼到別的模塊,根據實際需求業務邏輯來決定,cmp函數你可以放到其它地方,比如放到main的後面去,但是用的時候就得先申明了

⑩ C語言編程的一些技巧

也沒啥技巧,就是要注意,一般情況下,開頭的main函數,以及「;」符號,還有「{}」

閱讀全文

與c語言編程技巧分析相關的資料

熱點內容
php獨立運行 瀏覽:530
手機sh執行命令 瀏覽:727
雲伺服器的角色 瀏覽:733
單片機頻率比例 瀏覽:840
我的世界伺服器如何關閉正版驗證 瀏覽:504
如何查roid伺服器上的 瀏覽:130
安卓手機主板如何撬晶元不掉電 瀏覽:249
php各個框架的優缺點 瀏覽:101
php1100生成數組 瀏覽:359
以後做平面設計好還是程序員好 瀏覽:552
雲伺服器應用管理 瀏覽:438
飢荒雲伺服器搭建過程 瀏覽:186
可編程式控制制器優點 瀏覽:99
壓縮垃圾車說明書 瀏覽:28
五輪書pdf 瀏覽:802
單片機定時流水中斷系統流水燈 瀏覽:701
u8如何連接伺服器配置 瀏覽:68
動力在於緩解壓力 瀏覽:867
報考科一用什麼app 瀏覽:346
knn人臉識別演算法 瀏覽:431