當前位置:首頁 » 編程語言 » c語言高級技巧
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言高級技巧

發布時間: 2022-02-10 18:52:20

1. 在c語言編程中都有哪些技巧呢

c語言開始沒什麼學的,看書多寫幾個小程序,出幾個錯誤就知道該注意的細節了。技巧沒什麼的,我覺得就在開始就注意,編程書寫的規范,命名的規范,功能細節在函數中實現主函數調用,還有就是程序的結構和一些演算法的思想等等。

2. 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,熟練使用相應的嵌入匯編,可以大大提高程序執行的效率。

雖然是必殺技,但是如果輕易使用會付出慘重的代價。這是因為,使用了嵌入匯編,便限制了程序的可移植性,使程序在不同平台移植的過程中,卧虎藏龍,險象環生!同時該招數也與現代軟體工程的思想相違背,只有在迫不得已的情況下才可以採用。切記,切記。

3. C語言考試技巧

一.特點和注意事項 1、填空題
(1)上機填空題一般包含2個(或3個)空。 (2)要填空的位置用___、___、___表示。
(3)考生在考試時應刪除標識___、___、___後填入相應的符號。
特別要注意的是:只能在要填空的位置上進行修改,不要添行、刪除、合並或分解,不要改動程序行的順序,更不要自己另編程序。 2.改錯題
(1)上機改錯題中有2個(或3個)錯誤需要修改。
(2)試題中用「/******found******/」來提示在下一行(或下面第二行)有錯。 (3)錯誤的性質基本分為語法錯誤和邏輯錯誤,也有些試題要求把語句添加在下劃線處。
(4)特別要注意的是:只能在出錯的行上進行修 二.做題技巧
以下是對上機考試改錯題的做題方法和總結,改錯題的錯誤主要分為以下幾類:
一般情況,錯誤主要分為語法錯誤和邏輯錯誤。
先檢查語法錯誤,編譯程序後發現沒有錯誤及警告,說明沒有語法錯誤,只有邏輯錯誤;邏輯錯誤必須根據程序的功能及預期結果來考查。
因此,對於程序改錯題,應先編譯查找其中的語法錯誤,通過編譯器的提示容易找到錯誤的地方及原因,然後再尋找邏輯錯誤。修改了語法錯誤後再次編譯,直到修改完所有的語法錯誤。而查找邏輯錯誤時,需要運行程序根據結果來檢查。
1、if或while語句
若錯誤行是if或者while語句,則要注意以下點: 1)首先判斷是否正確書寫if或while關鍵字;
2)然後看有沒有用小括弧把整個表達式括起來,若沒有則加上小括弧; 3)若條件表達式中有指針變數而且沒有指針運算符時,則加上指針運算符; 4)若if條件表達式中只有一個等於號即數學等號(=),則要改寫成兩個等於號即邏輯等號(==);
若if條件表達式為其他的比較運算符,則一般是進行逆轉或加一個等於號; 2、for語句
若錯誤行是for語句,則要注意以下幾點: 1)首先判斷for有沒有書寫正確;
2)然後看for中的表達式是不是用分號(;)隔開,若不是則改為分號。 3、記住是分號(;),不是逗號(,)!
再者,分析for中的三個表達式,是否符合題意; 第一個表達式表示起始條件, 第二個表達式表示終止條件,
第三個表達式表示循環變數的變化。 4、return語句
若錯誤行為return語句,則要注意以下幾點: 1)首先看是不是正確書寫return關鍵字;
2)然後看是不是缺少分號,若是則加上分號即可;

3)再者判斷return後的變數或表達式是否正確;
這種錯誤需要根據題意來分析,分析返回變數或表達式的值和類型。 5、賦值語句
若錯誤行是賦值語句,則要看賦值是否正確,然後看賦值運算符是否寫正確。 6、定義語句
若錯誤行是定義語句,則要注意: 1)首先分析變數類型是否符合;
2)然後分析賦初值是否正確,求和初值賦0,求積初值賦1;
3)若以上均不是,則看是不是少定義了某個變數或少了花括弧; 7、關鍵字拼寫錯誤。如:main-mian(錯誤) printf - pirntf (錯誤)
Return- return(錯誤) while- While (錯誤)
8、表達式錯誤問題
表達式錯誤占的份量最多,並且沒有統一的改法,我們只能通過題目要求來分析並修改),
1)若錯誤行中有整數1除以某個表達式或變數時,必須把整數1改為1.0;若變數或表達式是整型時,則只能進行強制類型轉換。
2)變數必須先賦值,後才參與運算,沒有賦值就不能參與運算;例如,long k;k*=num%10;
3)運算符書寫錯誤,例如,把/寫成\(num\=10);,==寫成=。 4)丟失括弧() 9、字元串類問題
1)若錯誤行中有字元串結束符,則特別要要注意結束符有沒有寫錯(『\0』不要寫成"\0」)。
2)新組建的字元串一定要加結束標識符(『\0』); 3)要區分清楚字元『o』和數字『0』。
4)字元串復制、比較必須使用用字元串處理函數(strcpy或strcmp)實現,不能用賦值語句或關系運算符。 10、指針類問題
若錯誤行中有指針變數,並且該變數名之前沒有指針運算符,則般都是加上指針運算符;即注意p和*p的區別; 11、函數首部類問題:
若錯誤行是函數首部,則要注意:
1)首先看該行最後有沒有分號,若有則刪掉分號;若中間有分號則要改為逗號;
2)形參和實參類型不一致問題
① 若實參是個地址或數組名或指針變數名,則對應的形參肯定是指針或數組;
②若實參是二維數組名,則對應的形參應該是指針數組或是二維數組; ③若後面用到形參時有指針運算符,則該形參應為指針類型;
④若形參是二維數組或指向M 個元素的指針變數,則該二維的長度必須與main中對於數組的第二維的長度相同。 3)函數類型不一致問題
①若函數中沒有return語句,則函數類型為void;

②若函數中有ret urn語句,則函數的類型必須與rerun後的變數類型一致;
記住,調用函數的類型與main中的該函數的類型一致! 12、語法錯誤問題:
1)語句缺少分號。若錯誤號中語句沒有以分號結束則加上分號;
2)變數名不一致。C語言是區分大小寫的,若錯誤行中有大寫字母一般都改為小寫字母;
3)若錯誤行中有一條橫線,則必須將橫線刪除再填空。填空題中亦是如此。 13、邏輯錯誤問題:
這種題型主要是表達式錯誤,占的題量比較多而且沒有統一的做題方法,需要我們具體問題具體分析。對於邏輯錯誤,可按下列步驟查找:
①先讀試題,看清題目的功能要求。
②通讀程序,看懂程序中演算法的實現方法。 ③細看程序,發現常見錯誤點。 14、書寫錯誤問題:
特別注意我們的注釋部分,注釋是以/*開始,以*/結尾,不能有多餘的,有也只能在/*和*/裡面。注意,比如「/***注釋部分*****/*/」是錯誤的!
二、編程時容易犯的錯誤
1.書寫標識符時,忽略了大小寫的區別
C語言認為大些字母和小寫字母時兩個不同的字元,如在編譯程序過程中,系統會把a和認為時兩個不同的變數名。習慣上,符號常量名用大寫表示,變數名用小寫表示,以增加程序的可能性。
2.忽略了變數的類型,進行了不合法的運算
3.忽略了「=」與「= =」的區別;C語言中,「=」是賦值運算符,「= =」是關系運算符
4.忘記加分號
考生應特別注意這種情況,分號是C語言中不可缺少的一部分,語句末尾必須有分號,但有時候千萬不能加;
5.輸入變數時忘記加地址運算符「&」,而在不應加「&」的位置加了地址運算符
(1)忘記加「&」的情況。
如int a,b; scanf(「%d%d」,a,b);
此時,無法正確給a和b讀入數據。scanf函數的作用是:按照a、b在內存中所分配的地址將a、b的值存進去。「&a」指a在內存中的地址,因此正確的書寫格式為scanf(「%d%d」,&a,&b);。
(2)多加「&」的情況。如int str[ ]; scanf(「%s」,&str);
C語言編譯程序對數組名的處理是:數組名代表數組的起始地址,scanf函數中的輸入項是字元數組名,因此不必再加地址符&,應該去掉。
6.輸入數據的方式余要求格式(通配符)不符。例如:scanf(「%d,%d」,&a,&b);
C規定:如果在「格式控制」字元串中,除了格式說明以外還有其他字元,則在輸入數據時應輸入與這些字元相同的字元。下面輸入是合法的:3,4

此時不用逗號而用空格或其他字元是不對的,如:3 4(中間為空格)3:4(中間為冒號);
三、相關概念
(1)素數:定義是除了能被1和自身整除外,不存在其他任何能整除該數的自然數。因此,在判斷一個數是否為素數時,只要有除了1和本身能整除它,還有一個數能整除它,就判定此數不是素數。
(2)判斷一個年份是否為閏年:如果年份能被4 整除但是不能被100整除,或者能被400整除,這兩種情況滿足之一都是閏年。
(3)利用選擇法進行從小到大的排序。選擇法的思路為:把第一個元素與其後面的元素比較,如果比後面的大,則交換,比較完所有的元素後,第一個位置的元素是最小的元素;在把第二個元素與其後面的元素進行比較,結果是除了第一個元素外,第二個元素是最小的元素;以此類推。
(4)數的按位分離演算法是:對10取模求個位上的數字,整除10後再對10取模求十位上的數字,整除100後再對10取模求百位上的數字。
(5)最大公約數的演算法是:(1)若n>m,則用n除以m求余數r;(2)若r=0,則m為最大公約數,若r≠0,則將r賦值於m,m賦值於n,繼續用n除以m求余數r;(3)直到r=0,m為最大公約數。根據演算法判斷每一條語句是否正確。 (6)求最小公倍數的演算法:等於兩個數的乘積除以它們的最大公約數。 (7)矩陣時以行為外循環,列為內循環,可以同時計算周邊元素的和。

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

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

5. C語言解題技巧

1.首先你要清楚題目是什麼
2.確定處理題目要用到哪些實際上的,生活中的實際意義的實體,然後分析這些實體可以用C語言中哪些數據類型代替。
3.生活中,即題目中實體會發生什麼關系,對應到你程序中第2部做的對應的數據類型會有什麼操作。
4.程序數據類型操作前,根據實際情況,確定輸入,然後操作後,確定輸出。
希望對你有幫助!

6. 二級C語言的考試技巧

1、題庫每年都會有一點變化,但是變化不大,每一年的肯定會新增一些題目,萬卷不離其宗,考來考去知識點都那些,多看書,多做題,就差不多了。做歷年真題就行了,和考四六級一樣。都是模式化的東西。

2、計算機二級C語言考試的流程:
1)筆試:90分鍾,滿分100分,其中含公共基礎知識部分的30分。
2)上機操作:90分鍾,滿分100分。
上機操作包括:
(1) 基本操作。
(2) 簡單應用。
(3) 綜合應用。

3、計算機二級C語言考試內容 :
一、C語言程序的結構
1.程序的構成,main函數和其他函數。
2.頭文件,數據說明,函數的開始和結束標志以及程序中的注釋。
3.源程序的書寫格式。
4.C語言的風格。
二、數據類型及其運算
1.C的數據類型(基本類型,構造類型,指針類型,無值類型)及其定義方法。
2.C運算符的種類、運算優先順序和結合性。
3.不同類型數據間的轉換與運算。
4.C表達式類型(賦值表達式,算術表達式,關系表達式,邏輯表達式,條件表達式,逗號表達式)和求值規則。
三、基本語句
1.表達式語句,空語句,復合語句。
2.輸入輸出函數的調用,正確輸入數據並正確設計輸出格式。
四、選擇結構程序設計
1.用if語句實現選擇結構。
2.用switch語句實現多分支選擇結構。
3.選擇結構的嵌套。
五、循環結構程序設計
1.for循環結構。
2.while和do-while循環結構。
3.continue語句break語句。
4.循環的嵌套。
六、數組的定義和引用
1.一維數組和二維數組的定義、初始化和數組元素的引用。
2.字元串與字元數組。
七、函數
1.庫函數的正確調用。
2.函數的定義方法。
3.函數的類型和返回值。
4.形式參數與實在參數,參數值的傳遞。
5.函數的正確調用,嵌套調用,遞歸調用。
6.局部變數和全局變數。
7.變數的存儲類別(自動,靜態,寄存器,外部),變數的作用域和生存期。
八、編譯預處理
1.宏定義和調用(不帶參數的宏,帶參數的宏)。
2.「文件包含」處理。
九、指針
1.地址與指針變數的概念,地址運算符與間址運算符。
2.一維。二維數組和字元串的地址以及指向變數、數組、字元串、函數、結構體的指針變數的定義。通過指針引用以上各類型數據。
3.用指針作函數參數。
4.返回地址值的函數。
5.指針數組,指向指針的指針。
十、結構體(即「結構」)與共同體(即:「聯合」)
1.用typedef說明一個新類型。
2.結構體和共用體類型數據的定義和成員的引用。
3.通過結構體構成鏈表,單向鏈表的建立,結點數據的輸出、刪除與插入。
十一、位運算
1.位運算符的含義和使用。
2.簡單的位運算。
十二、文件操作
只要求緩沖文件系統(即高級磁碟I/O系統),對非標准緩沖文件系統(即低級磁碟I/O系統)不要求。
1.文件類型指針(FILE類型指針)。
2.文件的打開與關閉(fopen,fclose)。
3.文件的讀寫(fputc,fgetc,fputs,fgets,fread,fwrite,fprintf,fscanf函數的應用),文件的定位(rewind,fseek函數的應用)。

7. 我已經學了C語言基礎,請大家推薦些c語言高級技巧的書吧,謝謝

C專家編程,C 陷阱與缺陷等

8. c語言學習的技巧

的確是的,不可能有什麼捷徑和什麼大技巧的,靠的是積累,
代碼寫多了,思想也就有了,慢慢慢慢的,你會發現你就是大牛一枚、

9. 幾種C語言優化代碼技巧

以下內容摘自李亞鋒先生的《經典C面試真題精講》
1.結構體設計為成員最長類型長度的整數倍;
2.減少函數參數的個數,不需要返回值的函數定義為void類型;
3.if...else....多條件分支語句中,把出現頻率高的條件放在前面;
4.同時聲明多個相同類型變數優於分別單獨聲明變數;
5.減少定義全局變數;
6.使用#define定義常量和小的函數實現;
7.有些情況嵌套匯編語句效率更高;
8.佔用大的存儲空間可以減少執行時間,同理時間也可以換取空間;
9提高程序演算法效率;