第一篇:C語言編程總結--程序員必須知道的77條編程細節
C語言編程總結--程序員必須知道的77條編程細節
分類: C語言學習心得體會 2010-08-08 19:33 63人閱讀 評論(1)收藏 舉報
轉載請注明出處:http://blog.csdn.net/ecorefeng
在編程過程中會遇到各種各樣的錯誤與警告,這里我對編程過程中經常遇到的細節或者說常出錯的地方進行了簡單的總結,希望對正在編程的“童鞋”有所幫助:
C語言編程提示的總結:
1:使用 #include 指令避免重復聲明
2:使用 #define 指令給常量值取名
3:在 #include 文件中放置函數原型
4:在使用下標前先檢查它們的值
5:在 while 或 if 表達式中蘊含賦值操作
6:如何編寫一個空循環體
7:始終要進行檢查,確保數組不越界
8:良好的程序風格和文檔將使程序容易閱讀和維護
9:為了保持最佳的可移植性,把字符的值限制在有符號和無符號字符范圍的交集之內,或者不要在字符上執行算術運算
10:用它們在使用時最自然的形式來表示字面值
11:不要把整型值和枚舉值混在一起使用
12:不要依賴隱式聲明
13:在定義類型的新名字時,使用 typedef 而不是 #define
14:用 const 聲明其值不會修改的變量
15:使用名字常量而不是字面值常量
16:不要在嵌套的代碼塊之間使用相同的變量名
17:在一個沒有循環體的循環中,用一個分號表示空語句,并讓它獨占一行
18: for 循環的可讀行比 while 循環強,因為它把用于控制循環的表達式收集起來放在一個地方
19:在每個 switch 語句中都使用 default 子句
20:使用符號賦值符可以使用程序更容易維護
21:使用條件操作符代替 if 語句以簡化表達式
22:使用逗號操作符來消除多余的代碼
23:不要混用整型和布爾型值
24:一個值應該只具一種意思
25:如果指針并不指向任何有意義的東西,使它非法地指向了數組第 1 個元素的前面的內存位置
26:在函數原型中使用參數名,可以給使用該函數的用戶提供更多的信息
27:抽象數據類型可以減少程序對模塊實現細節的依賴,從而提高程序的可靠性
28:當遞歸定義清晰地優點可以補償它的效率開銷時,就可以使用這個工具
29:一開始就編寫良好的代碼顯然比依賴編譯器來修正劣質代碼更好
30:源代碼的可讀性機會總是比程序的運行時效率更為重要
31:只要有可能,函數的指針參都應該聲明為 const
32:在有些環境中,使用 register 關鍵字提高程序的運行時效率
33:在多維數組的初始值列表中使用完整的多層花括號能提高可讀性
34:不要試圖自己編寫功能相同的函數來取代庫函數
35:使用字符分類和轉換函數可以提高函數的移植性
36:把結構標簽聲明和結構的 typedef 聲明放在頭文件中,當源文件需要這些聲明時可以通過 #include 指令把它們包含進來
37::結構成員的最佳排列形式并不一定就是考慮邊界對齊而浪費空間最少的那種排列形式
38:把位段成員顯示地聲明為 signed in 或 unsigned 類型
39:位段是不可移植的40:位段時源代碼中位的操作表達得更為清楚
41:動態內存分配有助于消除程序內部存在的限制
42:使用 sizeof 計算數據類型的長度,提高程序的可移植性
43:消除特殊情況使代碼更容易維護
44:通過鍛煉語句消除 if 語句中的重復語句
45:不要僅僅根據代碼的大小評估它的質量
46:如果并非必要,避免使用多層間接訪問
47: cdecl 程序可以幫助你分析復雜的聲明
48:把 void* 強制轉換為其他類型的指針時必須小心
49:使用轉移表時,應始終驗證下標的有效性
50:破壞性的命令行參數處理方式使你以后無法再進行處理
51:不尋常的代碼始終應該加上一條注釋,描述它的目的和原理
52:避免用 #define 指令定義可以用函數實現的很長序列的代碼
53:在那些對表達式求值的宏中,每個宏參數出現的地方都應該加上括號,并且在整個宏定義的兩邊也加上括號
54:避免使用 #define 宏創建一種新語言
55:采用命名約定,使程序員很容易看出某個標識符是否為 #define 宏
56:只要合適就應該使用文件包含,不比擔心它的額外開銷
57:頭文件只應該包含一組函數和(或)數據的聲明
58:把不同集合的聲明分離到不同的頭文件中可以改善信息隱藏
59:嵌套的 #include 文件使我們很難判斷源文件之間的依賴關系
60:在可能出現錯誤的場合,檢查并報告錯誤
61:操縱文本行而無需顧及它們的外部標識形式,這個能力有助于提高程序的可移植性
62:使用 scanf 限定提高可移植性
63:當你打印長整數時,即使你所使用的機器并不需要,堅持使用 1 修改符可以提高可移植性
64:濫用 setjmp 和 longjmp 可能導致晦澀難懂的代碼
65:對信號進行處理將導致程序的可移植性變差
66:使用斷言可以簡化程序的調試
67:避免使用具有副作用的函數可以使程序更容易理解
68:一個模塊的接口應該避免暴漏它的細節
69:將數據類型參數化,是它更容易修改
70:只有模塊對外公布的接口才應該是公用的71:使用斷言來防止非法操作
72:幾個不同的實現使用同一個通用接口是模塊具有更強的可互換性
73:復用現存的代碼而不是對它進行改寫
74:迭代比尾部遞歸效率更高
75使用 stdarg 實現可變參數列表
76:改進算法比優化代碼更有效率
77:使用某種環境特有的技巧會導致程序不可移植
--end--
第二篇:C語言C++程序員編程必備
Java,NET,PHP,Ruby,Perl 和 Python 等,但今天我們要討論的是兩個最古老和流行的語言的C和C++。它們都有其特殊的地方,更有效的功能和支持的工具,這兩種語言仍然很活躍。
今天我們整理了一些令人印象深刻的IDE(集成開發環境)和編譯器推薦給 C 和 C++ 程序員。集成開發環境,主要用于提供軟件應用的各種組件而開發的,其中最流行的功能是它們都有吸引力的用戶界面。1)Best IDE for C/C++ – kDevelop KDevelop 是基于 KDevPlatform 的可使用開源插件擴展的 IDE。KDevPlatform 是一種可以用來作為 IDE 的基礎庫的開源集。
2)Best IDE for C/C++-Anjuta Anjuta Devstudio 具有先進的編程工具,包括項目管理,應用程序向導,交互式調試器,源代碼編輯器,版本控制,GUI設計器,分析器和許多工具,另一個偉大的開發工作室。此工具提供的 C/C++ 程序員有很大強大的用戶界面開發接口。
3)Best IDE for C/C++Eclipse CDT Eclipse CD 是最強大和最流行的IDE之一,提供了更高效的功能,如:項目的創建和管理,構建支持不同的工具鏈,標準make編譯,源代碼導航,各種來源的知識工具,代碼編輯器,語法高亮,折疊和超鏈接導航,源代碼重構和代碼生成,可視化調試工具,包括內存,寄存器等等。
7)Best IDE for C/C++ – Compilr Compilr 是在線集成開發工具,讓您與令人印象深刻的功能和簡單的用戶界面編寫代碼。該工具支持的編程語言中廣泛的C,C + + JAVA,HTML等等。
8)Best IDE for C/C++Netbeans C++ Netbeans 的工具包括許多適合 C 和 C++ 項目類型模板,可以 使用動態庫和靜態創建 C/C++ 應用程序庫。它擁有迷人的功能:代碼協助,編譯器配置,單元測試,源檢查,遠程開發和文件導航等等。
10)Best IDE/Compiler for C/C++Ultimate++ Ultimate++是對于 C++ 程序員來說是很好框架。這個 IDE 引入了模塊化概念,可以結合 GCC,MinGW 和 Visual C++。
12)Best Compiler for C/C++-Digital Mars DigitalMars 是一款高性能的 C/C++ 編譯器。包括的功能,如速度最快的編譯/鏈接時,強
HTML文檔,反匯編,圖書管理員,資源編譯器,make等,命令行和GUI版本,教程,代碼示例,在線更新,標準模板庫等等。
13)Best IDE for C-C-Free
14)Best Compiler for C/C++ – MinGW MinGW 編譯器提供訪問微軟的C運行庫和一些特定語言運行庫的功能。
15)Best Compiler for C – Tiny C Compiler iny C Compiler 是最好的編譯器之一,讓開發人員可以在任何地方編譯代碼,可以使用任何 C 動態庫,編譯并直接執行C++源程序,也包含完整的 C 預處理器和 GNU 匯編器。
@扣丁學堂 智悅分享
第三篇:編程規范(程序員必看)
編程規范(程序員必看)
作者:
評價:
上站日期:
內容說明:
來源:
.基本要求
1.1 程序結構清析,簡單易懂,單個函數的程序行數不得超過100行。1.2 打算干什么,要簡單,直接了當,代碼精簡,避免垃圾程序。1.3 盡量使用標準庫函數和公共函數。
1.4 不要隨意定義全局變量,盡量使用局部變量。1.5 使用括號以避免二義性。
2.可讀性要求
2.1 可讀性第一,效率第二。2.2 保持注釋與代碼完全一致。
2.3 每個源程序文件,都有文件頭說明,說明規格見規范。2.4 每個函數,都有函數頭說明,說明規格見規范。
2.5 主要變量(結構、聯合、類或對象)定義或引用時,注釋能反映其含義。2.7 常量定義(DEFINE)有相應說明。2.8 處理過程的每個階段都有相關注釋說明。2.9 在典型算法前都有注釋。
2.10 利用縮進來顯示程序的邏輯結構,縮進量一致并以Tab鍵為單位,定義Tab為 6個字節。
2.11 循環、分支層次不要超過五層。
2.12 注釋可以與語句在同一行,也可以在上行。2.13 空行和空白字符也是一種特殊注釋。2.14 一目了然的語句不加注釋。
2.15 注釋的作用范圍可以為:定義、引用、條件分支以及一段代碼。2.16 注釋行數(不包括程序頭和函數頭說明部份)應占總行數的 1/5 到 1/3。
3.結構化要求
3.1 禁止出現兩條等價的支路。3.2 禁止GOTO語句。
3.3 用 IF 語句來強調只執行兩組語句中的一組。禁止 ELSE GOTO 和 ELSE RETURN。3.4 用 CASE 實現多路分支。3.5 避免從循環引出多個出口。3.6 函數只有一個出口。3.7 不使用條件賦值語句。3.8 避免不必要的分支。
3.9 不要輕易用條件分支去替換邏輯表達式。
4.正確性與容錯性要求
4.1 程序首先是正確,其次是優美
4.2 無法證明你的程序沒有錯誤,因此在編寫完一段程序后,應先回頭檢查。4.3 改一個錯誤時可能產生新的錯誤,因此在修改前首先考慮對其它程序的影響。4.4 所有變量在調用前必須被初始化。4.5 對所有的用戶輸入,必須進行合法性檢查。4.6 不要比較浮點數的相等,如: 10.0 * 0.1 == 1.0,不可靠
4.7 程序與環境或狀態發生關系時,必須主動去處理發生的意外事件,如文件能否 邏輯鎖定、打印機是否聯機等。
4.8 單元測試也是編程的一部份,提交聯調測試的程序必須通過單元測試。
5.可重用性要求
5.1 重復使用的完成相對獨立功能的算法或代碼應抽象為公共控件或類。5.2 公共控件或類應考慮OO思想,減少外界聯系,考慮獨立性或封裝性。5.3 公共控件或類應建立使用模板。
附:C++ 編程規范,delphi作相應的參考
.1適用范圍
本標準適用于利用Visul C++ ,Borland C++進行軟件程序開發的人員.。
.2變量命名
命名必須具有一定的實際意義,形式為xAbcFgh,x由變量類型確定,Abc、Fgh表示連續意 義字符串,如果連續意義字符串僅兩個,可都大寫.如OK.具體例程:
BOOL類型
bEnable;
ch
*
char
chText c
*
類對象
cMain(對象實例)h
*
Handle(句柄)
hWnd i
*
int n
*
無符號整型 p
*
指針 sz,str *
字符串 w
WORD x,y
坐標
Char或者TCHAR類型
與Windows API有直接聯系的用szAppName[10]形式否則用
FileName[10]形式,單個字符也可用小寫字母表示;
Int類型
nCmdShow;
LONG類型
lParam;UINT類型
uNotify;
DWORD類型
dwStart;
PSTR類型
pszTip;
LPSTR類型
LPTSTR類型
LPVOID類型
WPARAM類型
LPARAM類型
HWND類型
HDC類型
HINSTANCE類型
HANDLE類型
HICON類型
int
float
DWORD
lpszClassName;lpReserved wParam, lParam hDlg;hDC;hInstance hInstance, hIcon;iTmp fTmp dw* 4
lpCmdLine
String , AnsiString
str *
m_
類成員變量
m_nVal, m_bFlag g_
全局變量
g_nMsg, g_bFlag
局部變量中可采用如下幾個通用變量:nTemp,nResult,I,J(一般用于循環變量)。
其他資源句柄同上
.3常量命名和宏定義
常量和宏定義必須具有一定的實際意義;
常量和宏定義在#include和函數定義之間;
常量和宏定義必須全部以大寫字母來撰寫,中間可根據意義的連續性用下劃線連接,每一 條定義的右側必須有一簡單的注釋,說明其作用;
資源名字定義格式:
菜單:IDM_XX或者CM_XX
位圖:IDB_XX
對話框:IDD_XX
字符串:IDS_XX
DLGINIT:DIALOG_XX
ICON:IDR_XX
.4函數命名 函數原型說明包括引用外來函數及內部函數,外部引用必須在右側注明函數來源: 模 塊名及文件名, 如是內部函數,只要注釋其定義文件名;
第一個字母必須使用大寫字母,要求用大小寫字母組合規范函數命名,必要時可用下劃線 間隔,示例如下:
void UpdateDB_Tfgd(TRACK_NAME);
//Module Name :r01/sdw.c
void PrintTrackData(TRACK_NAME);//Module Name :r04/tern.c
void ImportantPoint(void);
//Module Name :r01/sdw.c
void ShowChar(int , int , chtype);
//Local Module
void ScrollUp_V(int , int);
//Local Module
.5結構體命名
結構體類型命名必須全部用大寫字母,原則上前面以下劃線開始;結構體變量命名必須用 大小寫字母組合,第一個字母必須使用大寫字母,必要時可用下劃線間隔。對于私有數 據區,必須注明其所屬的進程。全局數據定義只需注意其用途。
示例如下:
typedef struct
{
char
szProductName[20];
char
szAuthor[20];
char
szReleaseDate[16];
char
szVersion[10];
unsigned long
MaxTables;
unsigned long
UsedTables;
}DBS_DATABASE;
DBS_DATABASE GdataBase;
控件的命名: 用小寫前綴表示類別
用小寫前綴表示類別: fm
窗口 cmd
按鈕
cob
combo,下拉式列表框 txt
文本輸入框 lab
labal,標簽 img
image,圖象 pic
picture grd
Grid,網格 scr
滾動條 lst
列表框 frm
fram
7注釋
原則上注釋要求使用中文;
文件開始注釋內容包括:公司名稱、版權、作者名稱、時間、模塊用途、背景介紹等,復 雜的算法需要加上流程說明;
函數注釋包括:輸入、輸出、函數描述、流程處理、全局變量、調用樣例等,復雜的函數 需要加上變量用途說明;
程序中注釋包括:修改時間和作者、方便理解的注釋等;
引用一: 文件開頭的注釋模板
/******************************************************************
** 文件名:
** Copyright(c)1998-1999 *********公司技術開發部
** 創建人:
** 日 期:
** 修改人:
** 日 期:
** 描 述: ** ** 版 本:
**---------------
******************************************************************/
引用二: 函數開頭的注釋模板
/*****************************************************************
** 函數名:
** 輸 入: a,b,c
**
a---
**
b---
**
c---
** 輸 出: x---
**
x 為 1, 表示...**
x 為 0, 表示...** 功能描述:
** 全局變量:
** 調用模塊:
** 作 者:
** 日 期:
** 修 改:
** 日 期: ** 版本
****************************************************************/
引用三: 程序中的注釋模板
/*---------------------------*/
/* 注釋內容
*/
/*---------------------------*/ 8 程序
a.程序編碼力求簡潔,結構清晰,避免太多的分支結構及太過于技巧性的程序,盡量不采用遞歸模式。
b.編寫程序時,亦必須想好測試的方法,換句話說,”單元測試” 的測試方案應 在程序編寫時一并擬好。
c.注釋一定要與程序一致。
d.版本封存以后的修改一定要將老語句用/* */ 封閉,不能自行刪除或修改,并要 在文件及函數的修改記錄中加以記錄。
e.程序中每個block 的開頭 ”{“ 及 ”}” 必須對齊,嵌套的block 每進一套,縮進一個tab,TAB 為4個空格,block類型包括if、for、while、do等關鍵字引出的。
f.對于比較大的函數,每個block 和特殊的函數調用,都必須注明其功能,舉例如下
:
count.divisor = 1193280 / freq;
// compute the proper count
OutByte((unsigned short)67,(unsigned char)182);// tell 8253 that a count is coming
OutByte((unsigned short)66, count.c[0]);
// send low-order byte
OutByte((unsigned short)66, count.c[1]);
// send high-order byte
×××××××××××××××××××××××××××××××××××××××
bcb,delphi中的變量命名:
遵循匈牙利命名法,命 名必須有意義,制定如下規定
窗體: 以大寫的W開始,如About版權窗體,命名為WAbout
文件:以大寫的F開始,如About版權窗體,文件命名為FAbout.cpp
按鈕(Button):如退出按鈕,命名為btnExit ……
基類: 加base標記,如報表基類,窗體命名為:WBaseRep, 文件命名為FBaseRep.cpp
第四篇:C語言編程
#include(stdio.h)
main()
{ int question[4]={-1,-1,-1,-1},i=0,j=0,k=0,A=0,B=0,answer[4]={0};
char again='y';
while(again=='y'){ srand((int)time(0));
while(i4){ k=(int)rand()%10;
for(j=0;ji;j++)if(k==question[j]){ k=-1;break;}
if(k==-1)continue;question[i]=k;i++;}/*while i*/
for(i=8;i0;i--)/*還有8次機會*/
{ A=0;B=0;printf(“n你還剩下%d次機會。”,i);
printf(“n請輸入四個0-9之間的數字,中間用空格隔開n”);for(j=0;j4;j++)scanf(“%d”,&answer[j]);
for(j=0;j4;j++)
for(k=0;k4;k++)
{ if(answer[j]==question[k]){ if(j==k)A++;else B++;} }/*for*/
if(A==4){ again='0';
printf(“n你贏了,還繼續猜嗎?(y/n)”);
while(again!='y'&&again!='n')
scanf(“...%c”,&again);break;}/*if*/
printf(“n%dA%dB”,A,B);if(i==1){ again='0';
printf(“n你輸了,正確答案是”);
for(j=0;j4;j++)
printf(“%dt”,question[j]);
printf(“n還繼續嗎?(y/n)”);
while(again!='y'&&again!='n')scanf(“%c”,&again);
printf(“%c”,again);break;}/*if*/ }/*for changce*/ }/*while again*/ printf(“感謝您玩這個游戲。”);}
第五篇:編程語言學習心得
程序語言學習的總結
通過兩年的學習,我們基本上掌握了C語言,C++和C#三個編程課程。對于程序設計語言的學習,分為學習語法規定、掌握程序設計方法、提高程序開發能力,這些都必須通過充分的實際上機操作才能完成。課程上的安排除了課堂講授以外,學院設有專門課堂到實驗室進行上機操作實驗。
要利用c語言學到的知識編寫c語言程序,即把c語言作為工具,通過上機才能檢驗自己是否掌握c語言、自己編寫的程序是否能夠正確地解題。通過上機實驗來驗證自己編制的程序是否正確。在這種思想支配下,可能你會想辦法去“掩蓋”程序中的錯誤,而不是盡可能多地發現程序中存在的問題。自己編好程序上機調試運行時,可能有很多你想不到的情況發生,通過解決這些問題,可以逐步提高自己對c語言的理解和程序開發能力。
在原有的C語言的基礎知識之上,初步接觸C++時感到比較簡單易懂。但隨著之后的步步深入學習,C++的不同之處以及其優勢逐。從第二章引入了C++簡單程序的設計。包括一些C++語言的概述,基本數據類型和表達式,數據的輸入與輸出,算法的基本東芝結構,以及自定義類型數據等知識。此部分多與C語言相似。之后又學習了函數的相關內容,這里學到了新的知識要點----函數重載。該內容尤其在現在做課程設計的時候尤為重要。類是C++語言的精華之所在,在學習中,我感覺到類和C語言中的結構體有很大的相似之處,但在類中的構造函數、拷貝構造函數以及類的組合,經常弄混淆一些概念。在這之后又學習了類的繼承與派生。這使得類與類之間形成了樹狀圖的模型,各子類可以訪問到父類的一些數據成員,同樣也實現了數據的之間的“共享”。我個人在編寫派生類的構造函數和拷貝構造函數時,感覺很不熟練,后面章節的多態性主要學習了運算符的重載,其本質就是函數的重載。
在學習C#中,類是具有相同特性和行為的對象的抽象。它使用關鍵字class聲明的。在c#中僅允許單個繼承,類只能從一個基類繼承實現。但是一個類可以實現一個以上的接口。對象是人們要進行研究的任何事物,從最簡單的整數到復雜的飛機等局可以看對象,它不僅表示具體的事物,還能表示抽象的規則、計劃或者事件。接口只是包含方法、委托或事件的簽名。方法的實現是在實現接口的類中完成的。接口可以是命名空間或類的成員,并可以包含下列成員:每個C#可執行文件都有一個入口—Main方法:static void Main()修飾符public表示可以在任何地方訪問該方法。所以可以在類的外部調用它。修飾符static表示方法不能在類的實例上執行,因此不必先實例化類在調用。在變量聲明時:變量是類或者結構中的字段,如果沒有顯示初始化,創建這些變量時,其值就是默認的0。變量是方法的局部變量就必須在代碼中顯示初始化,之后才能在語句中使用它們的值。
課堂上要講授許多關于語法規則,要使用這些工具解決問題,通過多次上機練習,對于語法知識有了更深刻的認識,在理解的基礎上就會自然而然地掌握。一個程序從編輯、編譯、連接到運行,都要在一定的外部操作環境下才能進行。通過上機實驗,熟練地掌握開發環境,為以后真正編寫計算機程序解決實際問題打下基礎。