營口職業技術學院 張文靜
C語言是計算機軟件進行編程設計的一項重要技術,本文從C語言的定義和語言特點著手,對C語言的編程技巧進行系統的研究和分析,并對加強優化C語言函數調用進行詳盡闡述,旨在為提升C語言在計算機軟件編程中的有效應用,提升計算機軟件編程效率和質量提供參考性依據。
作為一款計算機高級語言中最基礎的編程語言,C語言屬性簡單、使用方便、無編譯環境限制、語法限制較少,可以在不同的操作系統中運行,因此很容易做移植工作。C語言自出現以來,受到了廣大編程愛好者的歡迎,在漫長的發展歷史中,不斷的完善,最終形成了完整的理論體系,在編程語言中有著舉足輕重的地位。本文主要討論基于C語言下計算機軟件編程的一些技術思考。
C語言脫胎于B語言,自誕生后便引起一些頂級計算機學者的重視,并不斷的對其展開優化,終于在1989年誕生了完備的C標準。C語言是一門面向過程的編程語言,與后續強大的C++、Java、Python等面向對象的編程語言有所不同,C語言的設計目的在于提供簡易編寫、運行方便的能力,因此兼顧了低級語言、高級語言和匯編語言的優點,無需運行環境即可運行。C語言相較于其他語言具備較大優勢,編寫迅速、可讀性高、易調試、可移植,因為生成編譯目標僅比匯編語言慢10%~20%,可以用于編寫系統軟件,且在許多操作系統中都能得到適用,是一款非常強大的語言。
C語言是結構化語言,擁有獨特的編寫概念,可以按照清晰富有層次的模塊結構編寫程序,因此十分便于調試。另外,C語言的編譯速度很高,處理性能強大,支持全面的運算符與數據類型,可以幫助構建各種各樣的數據結構,具體特點如下:
(1)語言簡潔。C語言關鍵字僅32個、控制語句僅9個,且編程的過程中不限字母大小寫,自身不提供文件操作、硬件操作,但是可以通過調用相關庫來達到操作目的。
(2)結構化控制語句。C語言提供包括for循環、while循環、if……else條件語句、switch選擇語句等結構化語句,可以實現復雜函數的邏輯控制。
(3)豐富的數據類型。C語言數據類型豐富,提供包括整型、浮點型、字符型、數組型等數據類型,還具備其他語言不具備的指針型數據,這些數據類型形成了靈活多變的編程模式,幫助使用者做到各種數據類型的計算。
(4)豐富的運算符。C語言提供基本運算符號、賦值符號、多種括號、邏輯運算符號在內共34個運算符,由這些符號所組成的表達式非常豐富。
(5)直接操作物理地址。C語言可以通過某些庫函數,對硬件內存地址直接進行讀寫操作,在系統軟件編程領域有著廣泛的應用。
(6)可移植性。C語言主要解決用戶關注的問題本身,是一門面向過程的編程語言,因此用戶使用這種語言時無需關注所處的運行環境,只需要思考如何編寫代碼即可,當程序設計完畢后,可以很容易的在不同系統環境中運行,即使硬件環境不同也無需改動或進行少量改動,大大減少了程序移植的工作強度。
函數是每一個高級編程語言所具備的基礎結構,C語言也不例外,但是C語言所具備的特有函數則不同于任何其他語言,這些特有函數便是被稱為“頭文件”的系統原有函數。特有函數主要運用在編程過程中,當用戶想要引入一些庫函數輔助編程時,需要導入頭文件作為幫助,通過獨有的代碼指令“include”引入相應的頭文件,即可保證庫函數的正常運行。比如#include “stdio.h”,是最普遍和通用的頭文件,幾乎每一個編程文件都要引入。
指針是C語言最重要的變量類型應用,在變量聲明前使用*號,便表示這個變量是一個指針型變量,指針型變量存儲的是地址,而地址中存儲著變量的內容。C語言的指針可以是變量的地址,也可以是數組、數組元素、函數的地址,在調用的過程中需要考慮較多較復雜的情況,因此編程者需要仔細思考指針的運用,一旦指針運用不正確,則會導致很多潛在的錯誤,且這些錯誤不易被發現。
指針具有指針名、值、指針類型三要素,在編程的過程中都需要使用者給予科學定義,編程語言的命名也有著獨有的規則,程序員要懂得合理定義名稱,以便于區分指針型變量和普通變量,為了保證有效應用函數、算法,程序員可以設計流程圖將算法清晰表達出來。
位運算也是C語言的重要編程技巧之一,涉及到二進制數據對象。二進制指的是一系列由0、1數字組成的字符序列,由于現代計算機的底層邏輯與二進制息息相關,所有的數據都是以二進制的形式存儲在設備中,所以利用二進制數據做運算,其計算速度要高于普通十進制數據的運算速度。在程序設計和運算中,運算速度是考慮算法是否高明的一大評價要素,因為算法是程序的靈魂,所以程序員要懂得利用一切可能的方法提高算法的運算速度。位運算是對二進制數據做加減乘除,在運算的過程中將符號位也參與到運算中,比如35可以表示為00100011,47可以表示為00101111,相加后得到82表示為01010010,相比于十進制運算中需要考慮+-*/符號的運用,二進制的位運算能顯著提高代碼在機器上的執行效率。
C語言下的計算機軟件編程需要考慮到變量存儲器的科學定義,這樣可以幫助后續的編程工作有序開展,提高程序的精確度和準確性。程序員要考慮到不同定義的變量會產生不同效率的執行代碼,在可讀性和可行性方面也會有所影響,變量存儲器的嚴謹選擇是每一個程序員必須做到的事。
文件操作涉及到的也是二進制數據的操作,C語言能夠將程序文件以二進制數據的形式保存,方便后續的數據查找工作,并且也能大大加快文件的打開和讀寫效率。
在編程的過程中,考慮變量運算時的運算次序也非常關鍵,計算機編程語言并沒有涉及運算次序的規定,但是C語言設定了相關參數的求值順序是從右到左,方便了運算的常識化感知,也減弱了C語言編譯系統內容和方式的不同差異。
C語言和匯編語言都能夠直接操作計算機底層,因此都可以作為系統軟件的開發程序,又因為二者具有共同之處,可以在編寫程序的時候,將匯編語言嵌入C語言中,只需要使用大括號擴充程序,加入“asm”指令,并在其之前輸入代碼,用“:”隔開即可。
在基于C語言下的計算機軟件編程中需要考慮循環語句的用途,循環語句主要解決的是一些重復性計算或讀取的工作,可以通過設計循環次數來不斷重復執行某一段相同功能的代碼,循環語句設計的目的是減少冗余代碼,使程序變得簡潔有效。但是循環語句卻增加了代碼的運行效率,增加了時間復雜度,一般來說,一輪循環的時間復雜度是O(n),循環中嵌套循環的時間復雜度是O(n2),程序員為了有效節省程序運行時間,設計了多種加強循環語句的方法,使得循環語句更加的科學合理。
比如排序算法中,較為普通的冒泡排序、選擇排序和插入排序時間復雜度都是O(n),而快速排序、歸并排序和堆排序則通過不同的方式將時間復雜度減少為O(N*logN)。由點入面的思考,任何循環算法都可以仔細思考其是否有優化的手段,只有認可加強循環語句優化的作用,才能設計出高效的程序。
基于C語言下的計算機軟件編程是面向過程的編程,程序員在編寫程序的一大主要目的是解決存在的問題,然而有些問題的復雜程度較高,并不是簡單的設計幾行甚至幾十行代碼就可以解決的,程序員往往要編寫幾百行,甚至幾千行代碼,如果將所有代碼如同流水賬一般平鋪直敘,放到同一個編程文件中,則會顯得雜亂無章,且可讀性較差,因此函數和函數文件的使用顯得尤為重要。
函數指的是將某一功能單獨包裝而形成的代碼容器,是提供某一功能的代碼工具,解決了代碼組織結構不清晰、可讀性差、代碼冗余的問題,同時也增加了代碼的可維護性、可調式性和可拓展性。在設計函數時,需要考慮先定義、后調用的原則,在定義函數時,要給函數命名,提供可傳的參數和返回值(包括返回值類型和數量);在調用函數時,要使用函數名稱作為其內存地址,并根據函數的定義傳參,得到的返回值要賦給某一個變量。具體情況如下所示:
無參函數:

函數的實際定義與調用實例:下文代碼代表輸入兩個數字a和b,通過swap函數的作用,系統會將兩個數字排序,并按照從大到小的順序排列輸出。

3.3.1 匯編語言的嵌入
在對C語言為基礎的計算機軟件編程的優化過程中,有時候可以充分利用C語言和匯編語言,這兩種語言共同作用能夠提高程序的開發效率。程序員應該確保獨立編輯目標代碼,并找到二者可結合之處,巧妙的將匯編語言嵌入到C語言中,在寄存器的存儲和轉換作用下,將匯編語言成功運行。比如說如下代碼,利用“asm”指令,將匯編語言用大括號括起來,并用“:”區分C語言和匯編語言。

3.3.2 鏈接C語言和匯編語言
C語言與匯編語言的鏈接前,需要獨立設置編譯目標代碼,因為C語言和匯編語言能夠互相調用,因此在編程過程中,程序員要根據每個模塊的各自特點,設計兩種語言的目標文件,需要熟練掌握寄存器的使用、兩者間的參數傳遞、函數的返回值類型和變量類型、存儲模式等問題。需要注意的是,匯編語言的參數傳遞是堆棧程序,比如void aa(char *p, int i)這個函數如果轉換為匯編則是aa(&q, n),需要先在堆棧中壓入n,實現對存儲數據的存取,再調用子程序間的堆棧即可,會產生push bp、pop bp兩個執行指令。
3.3.3 C語言和匯編語言的混合編程程序分析
一般情況下,C語言與匯編語言的混合編程都可以從C語言的單獨編程中找出相同作用的實現方法,但是運行效率卻有明顯的不同。比如,比較5個數并獲取其中最小數時,利用匯編語言編寫子程序可以使用findmin.asm方法,這樣做的目的是提高程序的運行速度;利用C語言編寫主程序可以使用min.c程序,確保程序的調用可以正常進行,二者分工明確,共同作用,實現了程序的高速運行的保障。代碼如下所示:

每一個基于C語言下計算機軟件編程過程中,程序員都需要考慮按照標準編程流程進行,C語言不同于面向對象編程語言,不需要從需求分析、結構設計和詳細設計的流程考慮,而是要從解決問題的方法上考慮,思考代碼中應該存在的功能函數,并對其科學命名,思考每一個函數應該傳入的參數和返回的值,在具體編程中,要考慮利用結構化語句代替冗余語句,對每一個結構化語句的出口做出明確設計。
當程序編寫完成后,根據程序的復雜度,可以將其分成多個子文件分別存儲不同功能的邏輯代碼,每一個代碼可以獨立設計main函數,用來測試和維護單個功能的實現效果。程序的總體調試也是必不可少的一件事,程序員需要考慮詳細的測試方案,保證不出現測試死角,同時觀察程序運行的效率問題,盡可能提高程序的計算和運行速度。為了保證程序后續的可讀性和可維護性,程序員要習慣寫注釋,對關鍵代碼和每一個定義的變量后面,都要給予注釋標注其功能作用,這樣才能設計出完善且合格的代碼程序。
基于C語言的計算機軟件編程有著其獨特的編程技巧和優化方式,也存在利用匯編語言結合編程的手段,通過上文的探討,我們能夠更加明確C語言計算機編程工作的重要性,也能夠懂得對編程工作提出更高更嚴格的要求。程序員是編程工作的核心,需要提升自己的工作能力,對C語言有著全面且深刻的認識,才能夠保證在開發新軟件時面對高效、科學、合理的編程要求,能夠做到心中有數,不但實現軟件運行效率的提升,還能夠有效簡化編程過程,通過不斷的總結和進步推動我國計算機編程技術的全面發展。