C語言程序代碼_第1頁
C語言程序代碼_第2頁
C語言程序代碼_第3頁
C語言程序代碼_第4頁
C語言程序代碼_第5頁
已閱讀5頁,還剩52頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

代碼規范試用稿哈爾濱工業大學計算機科學與技術學院蘇小紅

sxh@1關于代碼風格問題代碼風格(CodingStyle)是一種習慣現在許多大公司都對員工書寫代碼制定了規范開發大項目時由項目管理者制定代碼規范程序風格的重要構成因素程序版式命名規則函數設計原則其他表達式規則與零比較常量規則動態數組內存管理程序版式程序版式——程序員的書法比書法好學得多,基本不需要特別練習但是壞習慣一旦養成,就像書法一樣難以改變不影響程序的功能,但影響程序的可讀性追求清晰、整潔、美觀、一目了然容易閱讀,容易測試程序版式不良的風格int

isprime(intn){int

k,i;if(n==1)return0;k=sqrt((double)n);for(i=2;i<=k;i++){if(n%i==0)return0;}return1;}#include<stdio.h>#include<math.h>main(){inti;for(i=2;i<100;i++){if(isprime(i))printf("%d\t",i);}}程序版式良好的風格int

isprime(intn){

intk,i; if(n==1)return0; k=(int)sqrt((double)n);

for(i=2;i<=k;i++){

if(n%i==0)

return0;}

return1;}#include<stdio.h>#include<math.h>main(){

inti;

for(i=2;i<100;i++){

if(isprime(i))

printf("%d\t",i);}}程序版式對齊(Alignment)與縮進(indent)——保證代碼整潔、層次清晰的主要手段“{”位置的兩種風格{和}獨占一行,且位于同一列,與引用它們的語句左對齊,便于檢查配對情況位于同一層{和}之內的代碼在{右邊數格處左對齊,即同層次的代碼在同層次的縮進層上一般用設置為4個空格的Tab鍵縮進,不用空格縮進voidFunction(intx){…//programcode}voidFunction(intx){…//programcode}if(condition){…//programcode}else{…//programcode}if(condition){…//programcode}else{…//programcode}for(initialization;condition;update){…//programcode}for(initialization;condition;update){…//programcode}while(condition){…//programcode}while(condition){…//programcode}如果出現嵌套的{},則使用縮進對齊,如:

{ … { … } …}建議的風格不建議的風格程序版式現在的許多開發環境、編輯軟件都支持“自動縮進”根據用戶代碼的輸入,智能判斷應該縮進還是反縮進,替用戶完成調整縮進的工作VC中有自動整理格式功能只要選取需要的代碼,按ALT+F8就能自動整理成微軟的cpp文件格式程序版式變量的對齊規則數據類型+N個TAB+變量名+[N個TAB]+=+[初始化值];例charname[20];charaddr[30];charsex='F';intage=20;floatscore=90;程序版式空行——分隔程序段落的作用在每個類聲明之后加空行在每個函數定義結束之后加空行在一個函數體內,相鄰兩組邏輯上密切相關的語句塊之間加空行,語句塊內不加空行//空行voidFunction1(…){…}//空行voidFunction2(…){…}//空行voidFunction3(…){…}//空行while(condition){ statement1; //空行

if(condition) { statement2; } else { statement3; }//空行

statement4;}程序版式代碼行內的空格——增強單行清晰度關鍵字之后加空格函數名之后不加空格賦值、算術、關系、邏輯等二元運算符前后各加一空格,但一元運算符前后一般不加空格sum=sum+term;(向后緊跟,),;向前緊跟,緊跟處不留空格,;后留一個空格Function(x,y,z)for(initialization;condition;update)[].->前后不加空格對表達式較長的for和if語句,為了緊湊可在適當地方去掉一些空格for(i=0;i<10;i++)if((a+b>c)&&(b+c>a)&&(c+a>b))voidFunc1(intx,inty,intz);//良好的風格voidFunc1(int

x,int

y,intz);//不良的風格printf("%d%d%d",a,b,c);//良好的風格printf("%d%d%d",a,b,c);//不良的風格if(year>=2000)//良好的風格if(year>=2000)//不良的風格if((a>=b)&&(c<=d))//良好的風格if(a>=b&&c<=d)//不良的風格for(i=0;i<10;i++)//良好的風格for(i=0;i<10;i++)//不良的風格for(i=0;i<10;i++)//過多的空格x=a<b?a:b;//良好的風格x=a<b?a:b;//不良的風格int*x=&y;//良好的風格int*x=&y;//不良的風格array[5]=0;//不要寫成array[5]=0;a.Function();//不要寫成a.Function();b->Function();//不要寫成b->Function();程序版式程序版式代碼行一行只寫一條語句,這樣方便測試一行只寫一個變量,這樣方便寫注釋intwidth;//寬度intheight;//高度intdepth;//深度盡可能在定義變量的同時,初始化該變量intsum=0;if、for、while、do等語句各占一行,執行語句無論有幾條都用{和}將其包含在內,這樣便于維護if(width<height){

DoSomething();}//空行OtherThing();intwidth; //寬度intheight; //高度intdepth; //深度intwidth,height,depth;//寬度高度深度x=a+b;y=c+d;z=e+f;x=

a+b;y=c+d;z=e+f;if(width<height){

dosomething();}if(width<height)dosomething();for(initialization;condition;update){

dosomething();}//空行other();for(initialization;condition;update)

dosomething();other();程序版式程序版式長行拆分代碼行不宜過長,應控制在70-~80個字符以內實在太長時要在適當位置拆分,拆分出的新行要進行適當縮進if((veryLongVar1>=veryLongVar2)&&(veryLongVar3>=veryLongVar4)){

DoSomething();}doubleFunctionName(doublevariablename1,doublevariablename2);for(very_longer_initialization;

very_longer_condition;

very_longer_update){

DoSomething();}程序版式修飾符*和&的位置有爭議從語義上講,靠近數據類型更直觀,但對多個變量聲明時容易引起誤解int*x,y;提倡靠近變量名int*x,y;注釋規范注釋(Comments)的重要性寫注釋給誰看?在哪些地方寫注釋?怎樣寫注釋?注釋的風格寫注釋時的注意事項可靈活運用的一些規則注釋規范注釋的重要性注釋對于程序猶如眼睛對于人的重要性一樣沒有注釋的程序對于讀者好比眼前一團漆黑,跟拿到一個可執行程序別無二致不規范的注釋和好幾千度的近似眼沒什么區別代碼本身體現不出價值開發程序的思維才能使其變得有價值這種思維的具體體現就是在于注釋和規范的代碼本身注釋規范寫注釋給誰看?給自己看,使自己的設計思路得以連貫給繼任者看,使其能夠接替自己的工作注釋規范寫注釋的最重要的功效在于傳承要站在繼任者的角度寫簡單明了、準確易懂、防止二義性讓繼任者可以輕松閱讀、復用、修改自己的代碼讓繼任者輕松辨別出哪些使自己寫的,哪些是別人寫的注釋規范不好的注釋i=i+1; //i加1return-1;//返回-1free(p); //釋放p所指的內存fclose(fin); //關閉文件/******************************************/ /*功能描述:本函數用于實現xxx功能,目的是: *//*入口參數:參數p,表示指向結構體的指針 *//*出口參數:參數xx,表示 *//*返回值:返回xx值,當返回xx值時,表示 */ /******************************************/注釋規范不好的注釋不但白寫,還擾亂了讀者的視線/*以二進制只讀方式打開文件并判斷打開是否成功*/if((fin=fopen("cat.pic","rb")==NULL){puts("打開文件cat.pic失敗");/*如果打開失敗,則顯示錯誤信息*/

return-1;/*返回-1*/}……/*從圖像的第1行到第400行循環*/for(i=0;i<400;i++)/*從圖像的第1列到第400列循環*/

for(j=0;j<400;j++){……/*按照公式Y=0.299*R+0.587*G+0.114*B計算灰度值*/y=(299*r+587*g+114*b)/1000;……}……fclose(fin);/*關閉文件*/注釋規范好的注釋(尤其是算法注釋)是對設計思想的精確表述和清晰展現,能揭示代碼背后隱藏的重要信息/*打開輸入文件后判斷文件長度是否符合格式要求*/if((fin=fopen("cat.pic","rb")==NULL){puts("打開文件cat.pic失敗");

return-1;}……/**下面是圖像轉換的算法實現。彩色圖像到灰度圖像的轉換主要利用RGB顏色空間到*YUV顏色空間的變換公式來取得灰度值,公式為Y=0.299*R+0.587*G+0.114*B*/for(i=0;i<400;i++)

for(j=0;j<400;j++){……y=(299*r+587*g+114*b)/1000;……}……fclose(fin);注釋規范在哪些地方寫注釋?在重要的文件首部文件名+功能說明+[作者]+[版本]+[版權聲明]+[日期]在用戶自定義函數前對函數接口進行說明函數功能+入口參數+出口參數+返回值(包括出錯處理)在一些重要的語句塊上方對代碼的功能、原理進行解釋說明在一些重要的語句行右方定義一些非通用的變量函數調用較長的、多重嵌套的語句塊結束處在修改的代碼行旁邊加注釋注釋規范函數的注釋風格C風格/**********************************************/ /*功能描述:本函數用于實現xxx功能,目的是: *//*入口參數:參數xx,表示 *//*出口參數:參數xx,表示 *//*返回值:返回xx值,當返回xx值時,表示 */ /**********************************************//*功能描述:本函數用于實現xxx功能,目的是:

入口參數:參數xx,表示

出口參數:參數xx,表示

返回值:返回xx值,當返回xx值時,表示

*/C++風格////////////////////////////////////////// //功能描述:本函數用于實現xxx功能,目的是://入口參數:參數xx,表示 //出口參數:參數xx,表示 //返回值:返回xx值,當返回xx值時,表示

//////////////////////////////////////////注釋規范一塊語句的注釋風格/* *C風格 */C風格/********************************/ /*下面代碼是用來接收網絡數據,其原理為*/ /*……*/ /********************************/////////////////////////////////// //VisualC++風格// //////////////////////////////////注釋規范一行語句的注釋風格/*C風格*///VisualC++風格i=j+1;//代碼行右方的注釋//代碼行之上的注釋 i=j+1;例子ResetSrollInfo(g_hwndThumb);//初始化滾動條位置for循環 { while循環 { if() {……}//if結束 }//while結束 }//for結束注釋規范寫注釋時的注意事項注釋不是白話文翻譯,不要鸚鵡學舌注釋不是教科書,不要把別人當成初學者注釋不是標準庫函數參考手冊注釋不是越多越好,不好的注釋等于垃圾不寫做了什么,寫想做什么邊寫代碼邊注釋修改代碼同時修改注釋注釋規范可靈活運用的一些規則注釋可長可短,但應畫龍點睛,重點加在語義轉折處簡單的函數可以用一句話簡單說明//兩數交換voidSwap(int*x,int*y)內部使用的函數可以簡單注釋,供別人使用的函數必須嚴格注釋,特別是入口參數和出口參數Readme的書寫內容主要用來記錄日期、創建者、內容等每次重大功能的添加、修改具體格式:日期—TAB—創建者—TAB—內容日期:2003.1.21 創建者:XXX 內容:實例工程日期—TAB—修改的文件名—TAB—修改的功能對修改后的功能和原理的說明……日期—TAB—修改的文件名—TAB—修改的功能對修改后的功能和原理的說明類的版式“以數據為中心”的版式private類型的數據寫在前面,public類型的數據寫在后面關注類的內部結構“以行為為中心”的版式public類型的數據寫在前面,private類型的數據寫在后面關注的是類應該提供什么樣的接口(或服務)提倡后者因為用戶最關心的是接口標識符命名規則按照執行級別分為:共性規則必須執行簡化規則建議采用可選規則靈活運用標識符命名的共性規則直觀可以拼讀,見名知意,不必解碼最好采用英文單詞或其組合,切忌用漢語拼音盡量避免出現數字編號不要出現僅靠大小寫區分的相似的標識符不要出現名字完全相同的局部變量和全局變量用正確的反義詞組命名具有互斥意義的變量或相反動作的函數int

minValue;int

maxValue;int

GetValue(…);int

SetValue(…);標識符命名的共性規則盡量與所采用的操作系統或開發工具的風格保持一致在Linux/Unix平臺習慣用“小寫加下劃線”function_name

variable_NameWindows風格大小寫混排的單詞組合而成FunctionName

variableNameWindows應用程序命名規則Microsoft公司的HungarianNotation主要思想在變量和函數名前加上前綴,用于標識變量的數據類型[限定范圍的前綴]+[數據類型前綴]+[有意義的英文單詞]限定范圍的前綴靜態變量前加前綴s_

,表示static全局變量前加前綴g_

,表示global類內的成員函數m_默認情況為局部變量數據類型前綴ch

字符變量前綴i整型變量前綴f實型變量前綴p指針變量前綴Windows應用程序命名規則缺點煩瑣例如inti,j,k;floatx,y,z;若采用匈牙利命名規則,則應寫成int

iI,iJ,ik;//前綴i表示int類型float

fX,fY,fZ;//前綴f表示float類型簡化的Windows應用程序命名規則變量名形式小寫字母開頭“名詞”或者“形容詞+名詞”如oldValue,newValue等函數名形式大寫字母開頭“動詞”或者“動詞+名詞”(動賓詞組)如GetValue(),SetValue()等宏和const常量全用大寫字母,并用下劃線分割單詞#define

ARRAY_LEN10constint

MAX_LEN=100;靈活運用的命名規則限定范圍的前綴與數據類型前綴可要可不要無特殊意義的循環變量可以直接定義成i,j,k等單字母變量表達式規則盡量簡單,不要太復雜不要多用途a=i+++i+++i++;printf("%d,%d,%d",i++,i++,i++);不要與數學表達式混淆if(a<b<c)不表示if((a<b)&&(b<c))無需背誦的規則運算符優先級先算括號用括號確定表達式的操作順序,避免使用默認的優先級庫函數用法會查聯機幫助、手冊最重要需要考慮移植性的問題不同平臺,不同編譯器,可能會迥然不同凡是需要字節數的地方,一律用sizeof獲得與零比較的規則布爾變量與零比較不應寫成if(flag==0)if(flag!=0)應寫成if(flag)//表示flag為真if(!flag)//表示flag為假與零比較的規則整型變量與零比較不應寫成if(value)//容易誤解為布爾變量if(!value)應寫成if(value==0)if(value!=0)寫成如下形式能防止==誤寫為=if(0==value)if(0!=value)與零比較的規則實型變量與零比較不應寫成if(x==0.0)//float和double變量都有精度限制應寫成if((x>=-EPS)&&((x<=EPS))if(fabs(x)<=EPS)與零比較的規則指針變量與零比較不應寫成if(p==0)//容易誤解為整型變量if(p!=0)if(p)//容易誤解為布爾變量if(!p)應寫成if(p==NULL)//強調p是指針變量if(p!=NULL)常量規則盡量使用含義直觀的常量來表示多次出現的數字或者字符串#definePI3.14159constfloatPI=3.14159;C++中用const常量完全取代宏常量需要對外公開的常量集中放在一個公共的頭文件中,不需要對外公開的常量放在定義文件的頭部常量規則怎樣建立在類中恒定,且僅在類中有效的常量?#define定義的宏常量是全局的const數據成員可以嗎?常量規則class

A{…

constintSIZE=100;//不能在類聲明中初始化const數據成員

int

array[SIZE];//類的對象未被創建時,SIZE值未知};const數據成員只能在類構造函數的初始化表中進行class

A{…

A(intsize);//構造函數

const

int

SIZE;};A::A(int

size):SIZE(size){…}Aa(100);//對象a的SIZE值為100Ab(200);//對象b的SIZE值為200常量規則怎樣建立在整個類中都恒定的常量呢?const數據成員只在某個對象生存期內是常量,而對類而言是可變的因為類可以創建多個對象不同對象的const數據成員值不同不能指望const數據成員了常量規則怎樣建立在整個類中都恒定的常量呢?應該用類中的枚舉常量來實現 class

A{…

enum{SIZE1=100,SIZE2=200};

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論