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

c改c語言提高效率

發布時間: 2022-09-18 01:34:44

① 如何提高c語言執行效率

把函數定義成宏形式,原理也就和內聯函數一樣,如果函數體內代碼短小,又經常調用,內聯函數效率高,反之使用函數調用。
編譯是把原代碼轉換成目標語言,運行就是執行目標語言。

② 如何提高C語言程序運行效率

最主要的措施就是改進演算法,如控制循環次數;多使用中間結果,減少運算次數等。
此外還可以從程序設計技術角度採取一些措施:如盡量減少值傳遞,多用引用來傳遞參數;減少減少除法運算;多用局部變數等。

③ 如何提高單片機C語言代碼效率

一.盡量定義局部變數
單片機程序的全局變數一般是放在通用數據存儲器(RAM)中,而局部變數一般是放在特殊功能寄存器當中。處理寄存器數據的速度比處理RAM數據要快,如果在一個局部函數里調用一個全局變數將會多生成好幾個代碼出來。所以,少定義全局變數,多定義局部變數。如上例中,如果把延時函數里的i和j定義為全局變數,編譯後程序代碼會增加到79個位元組,多了12個位元組。
二.省略函數定義
在一個單片機程序里我們習慣在main函數的前面先定義被調用函數,然後在mian函數的下面再實現被調用函數。這樣的寫法固然是一個好習慣,但每定義一個函數會增加幾個代碼,而且函數形參數據類型越大、形參越多增加的代碼就越多,顯然這不是什麼好事。如果不定義編譯器又報錯,怎麼辦?C編譯器的編譯順序是從上往下編譯,只要被調用的函數在主調函數調用之前實現就沒有問題了。所以,筆者的習慣寫法是不用定義函數,但要按先後順序(被調用函數一定要在主調函數之前寫好)來寫函數實現,到最後再寫main函數。這樣做編譯器不但不會報錯,而且代碼得到精簡了。如上例中,把延時函數的定義刪除了,然後把延時函數的實現搬到main函數的上面,編譯後程序代碼減少到63個位元組,減少了4個位元組。
三.省略函數形參
函數帶形參,是為了在函數調用時傳遞實參,不但可以避免重復代碼出現,還可以通過傳遞不同的實參值多次調用函數且實現不同的函數功能,總體代碼也會得到精簡。在實際編程的時候,我們只要注意,還可以進一步精簡代碼。對於不是多次調用或者多次調用但實參值不變的函數我們可以省略函數形參。如上例中的延時函數,我們把它改成不帶形參的函數:
void Delayms()//延時函數
{
unsigned int i,j;
for(i=0;i<500;i++)
for(j=0;j<120;j++);//大約延時1毫秒
}
編譯後,程序代碼變成了56個位元組,精簡了11個位元組。
四.改換運算符
也許您可能沒有注意到C運算符的運用也會影響程序代碼的數量。如上例中,把延時函數里的自加運算符改成自減運算符後,如:
void Delayms(unsigned int t)//延時函數
{
unsigned int i,j;
for(i=t;i>0;i--)
for(j=120;j>0;j--);//#p#分頁標題#e#大約延時1毫秒
}
編譯後,程序代碼變成了65個位元組,精簡了2個位元組。
通過改換運算符能達到精簡代碼的例子還有:
1.把求余運算表達式改為位與運算表達式。如:b=a%8 可以改為:b=a&7。
2.把乘法運算表達式改為左移運算表達式。如:b=a*8 可以改為:b=a<<3。
3.把除法運算表達式改為右移運算表達式。如:b=a/8 可以改為:b=a>>3。
五.選擇合適的數據類型
C語言里選擇變數的數據類型很講究,變數的數據類型過小滿足不了程序的要求,變數的數據類型過大會佔用太多的RAM資源。您可能還沒有注意到數據類型定義也影響程序代碼的大小,而且這個影響還不小。如上例中,延時函數里的局部變數j定義的數據類型明顯偏大,如果把它由unsigned int改成unsigned char 。編譯後,程序代碼變成了59個位元組,精簡了8個位元組。
六.直接嵌入代碼
在您的程序里如果某個函數只調用一次,而您又要求代碼提高執行速度,建議您不要採用調用函數的形式,而應該將該函數里的代碼直接嵌入主調函數里,代碼執行效率會大大提高。
七.使用效率高的C語句
C語言里有一個三目運算符「?」,俗稱「問號表達式」。很多程序員都很喜歡使用,因為它邏輯清晰表達簡潔。
看這個問號表達式:c=(a>b) ? a+1 : b+1;實際上等效於以下的if…else結構:
if (a>b) c=a+1;
else c=b+1;
可以看到,使用問號表達式,語句相當簡潔,但它的執行效率卻很低,遠沒有if…else語句效率高。所以,當您的程序要求提高執行速度的話,建議您不要使用問號表達式了。
另外,do…while語句也比while語句的效率高。
代碼的效率問題,不是我們編程中的主要問題,除了程序要求較高的執行速度或者單片機的ROM和RAM不夠用的時候才會考慮。一般情況下,我們不用在乎。如果您一味追求高效率的代碼,可能會影響代碼的可讀性和可維護性。

④ 如何提高C語言代碼效率

你是說運行效率嗎,運行效率的話就是減少代碼重復,動態申請內存,且不要申請過多,夠用即可,還有就是不要用過多循環,演算法能優化盡量優化!!
希望能夠幫助到你~~~~

⑤ C語言 怎麼改下代碼,加快下面程序的執行速度。。。

單獨從代碼上看,沒多少可改的,唯一可以增加效率的地方是
for(k=2;k<=sqrt(n);k++)
{
if(n%k==0)
{loop=1; break;}
}
在這里加一個break,避免多餘的運算

不過看你這個程序的功能,似乎是求2000000以內的素數,如果是的話,可以用素數篩
比這個快很多

⑥ c語言如何提高遞歸函數效率

可以改成非遞歸,不過遞歸改成非遞歸不是很容易。
此外設計遞歸演算法時要加上約束函數和上界函數進行啟發式搜索。避免搜索不必要的分支。

⑦ 怎樣提高學習C語言的效率

CString位於頭文件afx.h中。 CString 是一種很有用的數據類型。它們很大程度上簡化了MFC中的許多操作,使得MFC在做字元串操作的時候方便了很多。不管怎樣,使用CString有很多特殊的技巧,特別是對於純C背景下走出來的程序員來說有點難以學習。這篇文章就來討論這些技巧。使用CString可以讓你對字元串的操作更加直截了當。這篇文章不是CString的完全手冊,但囊括了大部分常見基本問題。這篇文章包括以下內容:CString 對象的連接格式化字元串(包括 int 型轉化為 CString )CString 型轉化成 int 型CString 型和 char* 類型的相互轉化char* 轉化成 CStringCString 轉化成 char* 之一:使用LPCTSTR強制轉化CString 轉化成 char* 之二:使用CString對象的GetBuffer方法CString 轉化成 char* 之三: 和控制項的介面CString 型轉化成 BSTR 型;BSTR 型轉化成 CString 型;VARIANT 型轉化成 CString 型;載入字元串表資源;CString 和臨時對象;CString 的效率;總結下面我分別討論。1、CString 對象的連接能體現出 CString 類型方便性特點的一個方面就是字元串的連接,使用 CString 類型,你能很方便地連接兩個字元串,正如下面的例子:CString gray("Gray");CString cat("Cat");CString graycat = gray + cat;要比用下面的方法好得多:char gray[] = "Gray";char cat[] = "Cat";char * graycat = malloc(strlen(gray) + strlen(cat) + 1);strcpy(graycat, gray);strcat(graycat, cat);2、格式化字元串與其用 sprintf() 函數或 wsprintf() 函數來格式化一個字元串,還不如用 CString 對象的Format()方法:CString s;s.Format(_T("The total is %d"), total);用這種方法的好處是你不用擔心用來存放格式化後數據的緩沖區是否足夠大,這些工作由CString類替你完成。格式化是一種把其它不是字元串類型的數據轉化為CString類型的最常用技巧,比如,把一個整數轉化成CString類型,可用如下方法:CString s;s.Format(_T("%d"), total);我總是對我的字元串使用_T()宏,這是為了讓我的代碼至少有Unicode的意識,當然,關於Unicode的話題不在這篇文章的討論范圍。_T()宏在8位字元環境下是如下定義的:#define _T(x) x // 非Unicode版本(non-Unicode version)而在Unicode環境下是如下定義的:#define _T(x) L##x // Unicode版本(Unicode version)所以在Unicode環境下,它的效果就相當於:s.Format(L"%d", total);如果你認為你的程序可能在Unicode的環境下運行,那麼開始在意用 Unicode 編碼。比如說,不要用 sizeof() 操作符來獲得字元串的長度,因為在Unicode環境下就會有2倍的誤差。我們可以用一些方法來隱藏Unicode的一些細節,比如在我需要獲得字元長度的時候,我會用一個叫做DIM的宏,這個宏是在我的dim.h文件中定義的,我會在我寫的所有程序中都包含這個文件:#define DIM(x) ( sizeof((x)) / sizeof((x)[0]) )這個宏不僅可以用來解決Unicode的字元串長度的問題,也可以用在編譯時定義的表格上,它可以獲得表格的項數,如下:class Whatever { ... };Whatever data[] = {{ ... },...{ ... },};for(int i = 0; i < DIM(data); i++) // 掃描表格尋找匹配項。這里要提醒你的就是一定要注意那些在參數中需要真實位元組數的API函數調用,如果你傳遞字元個數給它,它將不能正常工作。如下:TCHAR data[20];lstrcpyn(data, longstring, sizeof(data) - 1); // WRONG!lstrcpyn(data, longstring, DIM(data) - 1); // RIGHTWriteFile(f, data, DIM(data), &bytesWritten, NULL); // WRONG!WriteFile(f, data, sizeof(data), &bytesWritten, NULL); // RIGHT造成以上原因是因為lstrcpyn需要一個字元個數作為參數,但是WriteFile卻需要位元組數作為參數。同樣需要注意的是有時候需要寫出數據的所有內容。如果你僅僅只想寫出數據的真實長度,你可能會認為你應該這樣做:WriteFile(f, data, lstrlen(data), &bytesWritten, NULL); // WRONG但是在Unicode環境下,它不會正常工作。正確的做法應該是這樣:WriteFile(f, data, lstrlen(data) * sizeof(TCHAR), &bytesWritten, NULL); // RIGHT因為WriteFile需要的是一個以位元組為單位的長度。(可能有些人會想"在非Unicode的環境下運行這行代碼,就意味著總是在做一個多餘的乘1操作,這樣不會降低程序的效率嗎?"這種想法是多餘的,你必須要了解編譯器實際上做了什麼,沒有哪一個C或C++編譯器會把這種無聊的乘1操作留在代碼中。在Unicode環境下運行的時候,你也不必擔心那個乘2操作會降低程序的效率,記住,這只是一個左移一位的操作而已,使用_T宏並不是意味著你已經創建了一個Unicode的程序,你只是創建了一個有Unicode意識的程序而已。如果你在默認的8-bit模式下編譯你的程序的話,得到的將是一個普通的8-bit的應用程序(這里的8-bit指的只是8位的字元編碼,並不是指8位的計算機系統);當你在Unicode環境下編譯你的程序時,你才會得到一個Unicode的程序。記住,CString 在 Unicode 環境下,裡麵包含的可都是16位的字元哦。希望有幫助,謝謝採納哦!!!

⑧ C語言寫程序提高程序效率減小空間的方法都有哪些

演算法級別的顯然是最主要的優化,一個平方級演算法和一個超線性演算法的時間復雜度天差地別。但如果已經達到了演算法的下界,那麼就只能是針對程序進行優化了。其實編譯器乾的壞事往往比好事多,尤其是在做並行的時候~另外,先檢查下是否需要優化,如果不是瓶頸的地方再優化也沒有明顯效果,常用的優化手段一般是增大並行度,指令級或者線程級的,還有就是針對內存結構的特殊處理等等。具體可以參考計算機系統結構——量化研究方法,第三版我覺得不錯,第四版沒看。至於用C的話,比較靈活,比如自己消除遞歸,循環強度削弱,使用宏函數或者內聯函數,內嵌匯編等等都可以,視情況而定了。

⑨ c語言怎麼提高運行速度

這個程序有多組輸入,而這多組輸入的運算都是相同的,所以可以利用數組f之前計算過的信息。

在你的code里做的修改,如果有疑問,歡迎交流

#include<stdio.h>
intmain()
{
inta,b,n,c;
intpre_max_idx=2;
intf[100];
f[1]=1;
f[2]=1;
while(scanf("%d%d%d",&a,&b,&n)!=EOF)
{
if(n<=pre_max_idx){//如果之前計算過就直接返回
printf("%d ",f[n]);
continue;
}
if(n<=0)
continue;
for(c=n+1,n=pre_max_idx+1;n!=c;n++)//這里從pre_max_idx開始
f[n]=(a*f[n-1]+b*f[n-2])&7;
pre_max_idx=n-1;//修改當前的最大
printf("%d ",f[n-1]);
}
return0;
}

⑩ 如何提高C語言

首先申明,本人不是什麼高手,但自認為對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和指針》 說實話這兩本書我並沒有看過(或看完),但有口皆碑,都是經典之作,不過都已經絕版,仔細找找網上有下載的。 2、有哪些好的C語言練習(越難的越好)? 對語言本身的練習其實就是你對它的理解,用得多了,注意得多了,自然就ok了。其它思維上的練習主要是演算法和數據結構方面的,嚴老的《數據結構題集(C語言版)》如果你能做完就相當了不起了。 3、要學精C語言,還要具備哪些條件? 其實c語言也只是一個工具而已,就像鋤頭一樣,你每天挖地鋤田自然就精通它了。只要不是白痴,應該都沒有問題。 4、C語言學完後接下去要學哪些語言好? 這個我就沒有資格回答了,因為除了少量匯編和c++,我大部分只用到了c,不過也許是一脈相承的c++吧。c是面向過程的語言,學習c++面向對象的思想。 5、各位網友如果在學習計算機語言方面還有一些獨到的見解,歡迎提出! 不是我提出的,不過真的很經典——「天下程序一大抄」,呵呵。