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

c語言書寫法規則

發布時間: 2022-10-07 07:25:50

c語言,表達式書寫規則問題

④、y=z%x不對,取余的兩邊必須都是整數,而z是實型的!②、x+y=z不對,賦值表達式左邊是變數,不能是表達式!①、z=(y+x);x++這個書寫有沒有錯誤啊?是不是中間少個分號?③、y=ch+x這個是可以的,因為字元型的都是按ASCII碼存放的,運算時也是ASCII碼!

Ⅱ 求C語言編寫的一般格式

1,C語言程序的結構特點

一個C語言程序通常由一個預處理語句開始,如#include〉stdio.h〉,它表示,在編譯語言程序前,用指明的文件取代改預處理語句,通常文件名是帶有後綴為.h的磁碟文件.編譯時,它將從磁碟中讀出並插入到原來的預處理程序語句中.即預處理語句被指明的包含文件(頭文件)代替.
頭文件通常是在程序中被調用函數的說明語句和該函數用到的一些符號常量的宏定義.如在程序中經常調用一些標准庫函數時,系統提供了相應的頭文件,他們其中的一些內容是對該函數的說明及該函數用到的符號常量的宏定義等,如對fgets()的說明放在頭文件stdio.h中,再蓋頭文件包含了對fgets()函數的說明:
char *fgets(char *s,int n,FILE *stream)
對符號常量的定義:
#define NULL 0
當然還包含了一些其他的標准I/O函數的說明和宏定義等.用戶也可以建立自己的頭文件,在程序開頭用include進行包含就行了:
#include"文件名"
注意此時用" "符號來包括,它與 #include〉文件名〉的區別是查找的路徑不同.前者表示現在當前目錄中查找該文件,如果找不到,再到系統指定的目錄中查找.而後者只在系統的制定目錄中查找(一般是include\目錄),若找不到,便報錯.所以用#include"文件名"的形式常用於用戶自己寫的包含文件,他們通常放在和用戶程序同一個目錄下.當然在這種形式中,文件名也可用文件路徑代替,這時,編譯器就去用戶指定的目錄去查找包含文件.文件包含也可以用在程序行中,如:
main()
{
...
#include "myc.c"
...
}
其中myc.c時用戶的c文件,編譯時,它將從磁碟中取出,插入到該位置處.

一些在程序中常用到的常量也用編譯預處理命令#define來定義,如在真假判斷時,常用符號常量TURE和FALSE表示真和假,這時可以用一下定義:
#define TURE 1
#define FALSE 0
將以上代碼寫在程序的開頭,編譯時在程序中出現TURE的地方都用1代替,出現FALSE的地方用0代替.

一個完整的C程序,總是由main()函數開始,它像一個大型樂曲的引子,由此引出許多樂章(執行不同的功能的函數);main()函數又像一個大型建築的框架,它顯示了要完成這個建築的輪廓,這些輪廓就是由一個個函數調用勾畫出來的.因此可以說一個C程序是由一個個的模塊堆砌起來的,這些模塊的最小元素是函數.當然,模塊也可以是一個源程序,它又有許多的函數組成.所以c程序的設計是一種模塊化的設計,是許多的函數的堆砌.因此在應用程序的設計中,應將一個個的功能用一個個的函數來實現.下面就談談函數的使用.
turbo C的函數的使用

Turbo C2.0提供了400多個標準的庫函數,每個函數都完成一定的功能.當程序執行這些功能時,只要調用這些函數即可,用戶不必再自己寫這些函數了.這些庫函數包括輸入輸出函數,數學函數,字元串處理函數,內存函數,與BIOS和Dos有關的介面函數,屏幕函數和圖形函數,過程式控制制函數和目錄函數等.這些函數在我的主頁上都能查到,歡迎來查詢.
當標准庫函數中沒有用戶要用的函數時,就必須自己設計了,設計函數的原則是:
1,函數不應處理太多的功能,要保持函數的小型化,功能單一化.
2,一個函數要保持自己的獨立性,如同一個黑匣子一樣,有進有出.
3,在函數中多使用復合語句,使函數也具有結構化,並且可以提高執行效率和節省存儲空間.
4,在主函數前,要羅列出所有使用自定義函數的原型說明,這有利於在大型程序設計中追蹤要調用的函數設置是 否正確.
5,在程序適當的地方加入注釋(用/*...*/包含的語句)這便於程序的閱讀和調試.
6,採用層次的書寫程序格式,按程序的不同功能分層次.

這樣一個函數編譯後,其內部定義的程序代碼與數據與另一個函數的程序代碼和數據不會相互影響,因此在函數中要使用局部變數,即它的生存期指維持在調用該函數並執行時,也就是說函數被激活時.要盡量少用或不用全局變數,它將破壞函數的獨立性.函數的這種設計方法類似於面向對象設計方法中的封裝性.

C大型軟體程序的設計步驟

C語言作為結構化的程序設計語言,易採用自頂向下的設計方法,即開始咱不涉及問題的實質和具體的解決步驟,而只是從問題的全局出發,給出一個概括性的抽象描述.例如編寫一個信號處理程序,它要求對信號數據經過數字處理後進行圖形顯示並存檔.因而程序大輪廓應該是:
1,信號數據的輸入
2,信號預處理
3,信號進行數字處理
4,進行顯示
5,進行存檔

接著對各項功能進行細分,例如對於信號的輸入,又可分為:
1.通過com1或com2由RS-232介面進行輸入
2.由磁碟數據文件輸入

對信號預處理又可分為:
1.對信號進行反序排列
2.用窗函數預處理

對數字處理又可分為:
1.求快速傅立葉變換
2.求功率譜

對用窗函數處理又可分為:
1.海明窗處理函數
2.漢寧窗處理
3.布拉格曼窗處理

其他功能依此類推.

在此細化的基礎上再進行細化,以至於成為一個個單獨的功能,便於用一個個函數來實現.
下面就是設計一個個函數的實質性階段.要定義變數,要選區標准函數,要確定演算法,這是構造程序的基本單元.當一個個函數都設計完了以後,便可將這些函數在主函數中堆砌起來,並用主函數做總控程序,完成對他們的參數傳遞,控制選擇對這些函數的調用,形成一個完整的實用的信號處理程序.

大程序的設計風格

當一個程序較大時,可將一個程序分成幾個部分,每一個部分可單獨編成一個源文件,這些源文件可進行單獨編譯成.obj文件,然後將這些文件組合成一個較大的程序.通常可採用如下方法:

1.include方法
例如,一個程序分成兩個源文件,既由a1.c和a2.c兩個源程序組成,這時候可將a1.c寫成:

#include〉stdio.h〉
#include"a2.c"
main()
{
...
strcpy(s1,s2);
a2();
...
}
而a2.c可寫成:

#include〉string.h〉
void a2()
{
....
}

然後在製作一個project文件,內容為:a1.c a2.c
設這個工程文件名為:a1.prj,其中文件中各文件名的後綴可省略,先後順序也無關,它隻影響編譯時的順序.者可在Turbo c的編輯狀態下寫成,並存檔為a2.prj文件.然後用Alt+p選擇Project菜單中的Project_name項,填寫生成的a1.prj文件名.然後按F9,即可生成a1.exe可執行文件.

當用匯編語言與C語言混合編程時,則要將匯編語言子程序單獨編譯生成.obj文件,然後製作工程文件,再進行對C程序的編譯和連接.關於這方面的介紹可參考Turbo c2.0的命令行編譯.

若程序還需要一些其他的被編譯的程序或庫文件,這些文件時C語言的標准庫不能提供的,則也可將它們的名字放在Project文件中.如:

mymain
myfunc
secial.obj
other.lib

當用F9進行編譯連接時,對後綴為.obj的文件只進行連接,對後綴為.lib的庫文件不會進行編譯,只是進行連接,這樣當進行外部調用時,就只會對庫進行檢索.
當多個源文件製作成project 文件時,一個.c的源文件依賴於其他的.c源文件,若它們之間用一個頭文件來進行介面,這時應用括弧將這些頭文件擴起來(頭文件之間可用逗號,空格或分號間隔),這樣一旦頭文件改變時,它們將被重新編譯,例如:有一個主程序名為mymian.c,它包含頭文件為:myfuncs.h,而另一個文件是myfuncs.c
這樣當project文件的內容寫成如下形勢時:

mymain.c(myfuncs.h)
myfuncs.c(myfuncs.h)
若一旦myfuncs.h被修改,則對該project文件進行編譯時,mymain.c及myfuncs.h將被重新編譯

Ⅲ C語言書寫格式標準是什麼

你的錯誤是沒加頭文件,因為使用printf需要調用庫函數 stdio.h。

符號名包括模塊名、常量名、標號名、子程序名等。這些名字應該能反映它所代表的實際東西,具有一定的意義,使其能夠見名知義,有助於對程序功能的理解。命名採用匈牙利命名法。具體規則如下:
(1)所有宏定義、枚舉常數和const變數,用大寫字母命名。在復合詞里用下劃線隔開每個詞。
(2)復合詞中每個單詞的第一個字母大寫。除了規則5.1.1.1以外,避免使用下劃線。
(3)類、類型定義和枚舉型名的第一個字母大寫。
(4)函數名是復合詞的,第一個詞採用全部小寫,隨後每個單詞採用第一個字母大寫,其它字母小寫方式;如果是單個詞的,採用全部小寫方式。
(5)循環變數可採用i, j, k等,不受上述規則限制。
(6) 類的成員變數應採用m_開頭。
(7) 全局變數詞頭為g_ 。
(8) 臨時變數詞頭為tmp_ 。
(9) 對結構體內的變數命名, 遵循變數的具體含義命名原則
(10)用小寫字母的前綴表示變數的類型,前綴的下一個字母用大寫。

——文件之中不得存在無規則的空行,比如說連續十個空行。
一般來講函數與函數之間的空行為2-3行;
在函數體內部,在邏輯上獨立的兩個函數塊可適當空行,一般為1-2行。
——程序編寫首先應考慮清晰性,不要刻意追求技巧性而使得程序難以理解。
——每行長度盡量避免超過屏幕寬度,應不超過80個字元。
——除非對效率有特殊要求,編寫程序要作到清晰第一,效率第二。
——盡可能使用函數庫。
——盡量用公共過程或子程序去代替重復的功能代碼段。要注意,這個代碼應具有一個獨立的功能,不要只因代碼形式一樣便將其抽出組成一個公共過程或子程序。
——使用括弧清晰地表達算術表達式和邏輯表達式的運算順序。如將 x=a*b/c*d 寫成 x=(a*b/c)*d可避免閱讀者誤解為x=(a*b)/(c*d)。
——避免不必要的轉移。
——避免採用過於復雜的條件測試。
——避免過多的循環嵌套和條件嵌套。
——建議不要使?*=,^=, /=等運算符。
——一個函數不要超過200行。一個文件應避免超過2000行。
——盡量避免使用go to語句。
——避免採用多賦值語句,如x = y = z ;
——不鼓勵採用?:操作符,如z = (a>b)?a:b;
——不要使用空的if else 語句。

Ⅳ C語言程序設計基礎概念

C語言程序設計基礎概念

C語言是近年來非常流行的語言,很多人寧願放棄已經熟悉的其他語言而改用C語言,其原因是C語言有優於其他語言的一系列特點。下面是我搜集的C語言程序設計基礎概念,希望大家認真復習!

1.1 C語言的特點

C語言是近年來非常流行的語言,很多人寧願放棄已經熟悉的其他語言而改用C語言,其原因是C語言有優於其他語言的一系列特點。下面是C語言的主要特點:

(1)語言簡潔、緊湊,並且使用方便、靈活;

(2)運算符豐富;

(3)數據結構豐富;

(4)具有結構化的控制語句;

(5)語法限制不太嚴格,使程序設計比較自由;

(6)C語言允許用戶直接訪問物理地址,能進行位(bit)操作,可以直接對硬體進行操作。

1.2 源程序的書寫規則

C語言的書寫規則。C語言書寫格式自由,一行內可以寫幾個語句,一個語句也可以分寫在多行上。C程序沒有行號,每個語句和數據定義的.最後必須有一個分號。C語言中分號是語句中不可少的,即使是程序中的最後一個語句也應該包含分號。C語言中的注釋可以用〃/*〃用〃*/〃結束,注釋可以在任何允許插入空格符地方插入。C語言中注釋不允許嵌套,注釋可以用西文,也可以用中文。

1.3 C語言的風格

由於C語言對語法限制不太嚴格,為了保證程序的准確性和可讀性,建議在書寫程序採用階梯縮進格式。也就是按如下格式書寫C語言程序:

**********;

*****()

{

**********;

********;

{

******;

……

}

*********;

}

概括起來,C語言程序具有如下的風格:

①C語言程序的函數具體模塊結構風格,使得程序整體結構清晰、層次清楚,為模塊化程序設計提供了強有力的支持。

②C語言的源程序的擴展名都是.C。

③C語言中的注釋格式為:

/*注釋內容*/

/與*之間不允許有空格,注釋部分允許出現在程序中的任何位置。

④C語言中的所有語句都必須以分號“;”結束。

;

Ⅳ C程序書寫格式自由,一個語句可以寫在多行上嗎

可以。

1、只要關鍵字不分行就行; 比如: if(a==b || a==c) 等價於 if( a==b || a==c )。

2、在C語言中,注釋可以加在程序中的任何位置。

Ⅵ C語言怎麼寫比較規范啊,比如下面兩種寫法,哪個才更標准一些呢,求大神指教!

C語言 在書寫的時候
大括弧的位置
函數和變數的命名規則
下劃線的使用
大小寫使用
空格的添加
這些 都有不同的規則
不過 到目前為止 沒有一個通用的
都是各自規定

比如你這兩個 大括弧的寫法 哪種都有人用 無所謂更規范。
如果沒有要求 任何一種寫法都可以
但不同公司要求不同的

Ⅶ c程序在書寫時有嚴格的縮進要求否則不能編譯通過

所有的C語言編譯器是沒有這樣的規定的。C語言本身是一種非常靈活的編程語言,包括它的書寫格式和語法表達。C語言每一個語句都是以「;」結束,只要遵循這個原則即可,並沒有強制要求必須以縮進方式編寫程序,也不影響程序的編譯。通常以縮進方式編寫程序是一種比較提倡的好的習慣和做法,有利於對程序的理解和檢查。

Ⅷ C語言的書寫規則主要有哪些呢

1.
1.1符號命名規則
1.1.1符號名包括模塊名、常量名、標號名、子程序名等。這些名字應該能反映它所代表的實際東西,具有一定的意義,使其能夠見名知義,有助於對程序功能的理解。命名採用匈牙利命名法。規則如下:
(1)所有宏定義、枚舉常數和const變數,用大寫字母命名。在復合詞里用下劃線隔開每個詞。
(2)復合詞中每個單詞的第一個字母大寫。除了規則5.1.1.1以外,避免使用下劃線。
(3)類、類型定義和枚舉型名的第一個字母大寫。
(4)函數名是復合詞的,第一個詞採用全部小寫,隨後每個單詞採用第一個字母大寫,其它字母小寫方式;如果是單個詞的,採用全部小寫方式。
(5)循環變數可採用i, j, k等,不受上述規則限制。
(6) 類的成員變數應採用m_開頭。
(7) 全局變數詞頭為g_ 。
(8) 臨時變數詞頭為tmp_ 。
(9) 對結構體內的變數命名, 遵循變數的具體含義命名原則
(10)用小寫字母的前綴表示變數的類型,前綴的下一個字母用大寫。
表 1
詞頭 類型 詞頭 類型
ch char l long
i integer u unsigned
b boolean p pointer
f float lp long pointer
d double s string
st structure sz ASCII string
by byte n short int
H handle x,y 分別為x,y坐標
dw DWORD fn function

表 2
詞頭 變數名 詞頭 變數名
task task sig signal
sb binary semaphores wd watchdog
sm mutual exclusion tm timer
sc counting semaphores msg message
pipe pipe

例:
#define ARRAY_SIZE 24 /*規則5.1.1.1*/

int g_iFlag;
class MyClass /*規則5.1.1.3*/
{
};

void someFunc( ) /*規則5.1.1.2和5.1.1.4*/
{

int nArray[ARRAY_SIZE];
unsigned char uchByte;
char szName[ ];
char *pszName = szName;
}

(11)有些詞頭(如p和u)可以和其它詞頭組合。

例:WDOG_ID wdId;
WDOG_ID g_wdId; /*全局watchdog Id,故以g_開頭*/

1.1.2名字的長度一般不要過長或過短。過長的名字會增加工作量,使程序邏輯流程變得模糊;過短的名字無法表達符號的實際意義。約定長度范圍:3-31;

1.2數據和函數說明
1.2.1數據說明次序應當規范化,使數據屬性容易查找,也有利於測試、排錯和維護。說明的先後次序應固定,應按邏輯功能排序,邏輯功能塊內建議採用下列順序:整型說明、實型說明、字元說明、邏輯量說明。
1.2.2如果設計了一個復雜的數據結構,應當通過注釋對其變數的含義、用途進行說明。
1.2.3在函數的聲明中使用異常聲明。
如:void f() throw(toobig, toosmall, divzero);
在聲明一個函數時,將它所拋出的異常列出,便於函數的使用者了解可能會發生哪些異常。

1.3 程序注釋
1.3.1程序注釋是程序員與日後的程序讀者之間通信的重要手段之一,注釋分為文件注釋、函數注釋和功能注釋。
1.3.2正規程序的注釋應注意:
——注釋行的數量佔到整個源程序的1/3到1/2。
1.3.3文件注釋位於整個源程序的最開始部分,注釋後空兩行開始程序正文。它包括:
——程序標題。
——目的、功能說明。
——文件作者、最後修改日期等說明。
例:
./********************************************************************
(空一行)
標題: Demo.c
功能: 測試VxWorks的各種系統調用.
說明:
該程序測試各種VxWorks的系統調用函數。包括任務(taks)的創建、掛起及任務間通過信號燈實現同步,通過消息隊列 進行通訊。
程序創建了兩個任務:一個高優先順序的任務和一個低優先順序的任務。兩個任務間通過一個二進制的信號燈進行同步,通過消息隊列進行通訊。
當前版本: x.x
修改信息: 2000.06.05 John, Initial Version
2000.07.05 Tom, Bug xxxx fixed
**************************************************************/
(空2行,開始程序正文)

1.3.4 函數注釋通常置於每函數或過程的開頭部分,它應當給出函數或過程的整體說明對於理解程序本身具有引導作用。一般包括如下條目:
——模塊標題。
——有關本模塊功能和目的的說明。
——調用格式
——介面說明:包括輸入、輸出、返回值、異常。
——演算法。如果模塊中採用了一些復雜的演算法。
例:
file://(/注釋開頭應和上一函數空兩行)
(注釋開頭與上一函數最後一行間隔兩行)
/********************************************************************
標題:assignmentComplete
功能:BSC=>MSC消息生成函數,生成assignment_complete指配完成消息(BSMAP消息) .
格式:
int assignmentComplete(int iCellId, int iServiceChannnelNum, char *pszMSGData) throw(exception1, exception2)
輸入:
int iCellId: MS所在的小區識別
iCellId取值:0x00-——0xff

int iServiceChannnelNum:MS所佔的業務信道號碼
輸出:
char * pszMSGData:指配完成消息數據
返回值: 0x00正常
異常:exception1異常情況1, exception2異常情況2
********************************************************************/
( 注釋後直接開始程序正文,不空行。)
1.3.5功能性注釋嵌在源程序體中,用於描述其後的語句或程序段做什麼工作,也就是解釋下面要做什麼,或是執行了下面的語句會怎麼樣。而不要解釋下面怎麼做,因為解釋怎麼做常常與程序本身是重復的。
例:
/*把 amount 加到 total中*/
total = amount + total;
這樣的注釋僅僅是重復了下面的程序,對於理解它的工作並沒有什麼作用。而下面的注釋,有助於讀者理解。
/*將每月的銷售額amount加到年銷售額total中*/
total = amount + total;
1.4 函數編寫應盡可能短小精悍,一般不超過兩屏,以便於調試和理解。

1.5語句結構
為保證語句結構的清晰和程序的可讀性,在編寫軟體程序時應注意以下幾個方面的問題:
——在一行內只寫一條語句,並採用空格、空行和移行保證清楚的視覺效果。
——每一個嵌套的函數塊,使用一個TAB縮進(可以設定為4個空格),大括弧必須放在條件語句的下一行,單獨成一行,便於匹對:
如,有一段程序如下:
for(i=1;i<n-1;i++){ t=1; for(j=i+1;j<n;j++){
if(a[j]<a[t] ) t=j; if(t!=i ){work=a[t];a[t]=a[I];a[I]=work;}}}
應寫為
for( i=1; i<n-1; i++)
{
t=1;
for(j = i+1; j<n; j++)
{
if(a[i]<a[j])
t=j;
if(t!=1)
{ .5.

Q/ECC/BJ 010—2001
work=a[t];
a[t]=a[i];
a[i]=work;
}
}
}

——文件之中不得存在無規則的空行,比如說連續十個空行。
一般來講函數與函數之間的空行為2-3行;
在函數體內部,在邏輯上獨立的兩個函數塊可適當空行,一般為1-2行。
——程序編寫首先應考慮清晰性,不要刻意追求技巧性而使得程序難以理解。
——每行長度盡量避免超過屏幕寬度,應不超過80個字元。
——除非對效率有特殊要求,編寫程序要作到清晰第一,效率第二。
——盡可能使用函數庫。
——盡量用公共過程或子程序去代替重復的功能代碼段。要注意,這個代碼應具有一個獨立的功能,不要只因代碼形式一樣便將其抽出組成一個公共過程或子程序。
——使用括弧清晰地表達算術表達式和邏輯表達式的運算順序。如將 x=a*b/c*d 寫成 x=(a*b/c)*d可避免閱讀者誤解為x=(a*b)/(c*d)。
——避免不必要的轉移。
——避免採用過於復雜的條件測試。
——避免過多的循環嵌套和條件嵌套。
——建議不要使用 *=,^=, /=等運算符。
——一個函數不要超過200行。一個文件應避免超過2000行。
——盡量避免使用go to語句。
——避免採用多賦值語句,如x = y = z ;
——不鼓勵採用?:操作符,如z = (a>b)?a:b;
——不要使用空的if else 語句。如
if(cMychar >= 『A』)
if(cMychar <= 『Z』)
printf(「This is a letter \n」);
else
printf(「This is not a letter \n」);
else到底是否定哪個if容易引起誤解。可通過加{}避免誤解。
——盡量減少使用「否定」條件的條件語句。如:
把 if( !( (cMychar<』0』) || (cMychar>』9』) ) )
改為if( (cMychar>=』0』) && (cMychar<=』9』)

Ⅸ C語言書寫格式嚴格,要求一行內只能寫一個語句,對嗎

淡然不是啦 一行可以寫好多句 比如
if(a==1){ a=1;b=2;c=3;d=a+b+c;printf("%d",d);}
這樣是可以的 這樣寫只是不美觀 不過你也可以把他(花括弧裡面的)理解為一個語句

Ⅹ 求助,關於c語言的。

C語言基礎(01-引言及預備知識): C語言是一門功能強大的編程語言,它也是C++語言的基礎。C語言屬於中級語言。這里所說的中級是相對於計算機的底層硬體而言的。匯編語言是最低級的語言,它可以直接與硬體打交道。高級語言有Pascal、Basic、Fortran等等。高級語言的一條語句對應低級語言的很多條語句,任何高級語言編寫的程序都要經過編譯程序的編譯、連接才能成為可以運行的程序。編譯連接的過程也就是把高級語言翻譯成機器語言(二進制機器碼)的過程,而匯編語言是基本上與機器語言一 一對應的一種語言。這個翻譯過程是由編譯程序自動完成的。把C語言定為中級語言是有它的道理的,因為C語言既有匯編語言的存取底層硬體的能力,又具有高級語言的許多特點。熟練掌握了C語言,學習其它的各種編程語言應該是很輕松的了。

C語言的書寫格式:
1) 一個C語言編寫的源程序,必定有一個主程序(稱為main()函數,在C語言中子程序稱為「函數」(當然,不要理解成為數學裡面的「函數」)。但是決不能有一個以上的main函數(即只能有一個)。
2) 函數語句塊用『{』括弧開始, 以『}』反括弧結束。這樣的花括弧必須成對出現。
3) 表達式寫在小括弧裡面,以『(』括弧開始,以『)』反括弧結束。
4) 函數不能嵌套,即函數裡面不能再套函數。(每一個函數是完成一個特定功能的函數模塊)

C語言的組成:
C語言是由許多函數組成的。其中只有一個主函數(main()函數)。C程序執行時總是從main函數的『{』處開始,至main函數的反大括弧'}'處結束。當然還有其它一些規則,這將在以後的學習中去熟悉它。

C語言的書寫規則:
C語言在書寫時有它自身的特點:書寫格式比較自由,在一行里可以寫多條語句,一個語句也可以分寫在多行上。雖然如此,在書寫源程序時還是要注意哪些可以自由書寫,而哪些必須要按照書寫規則來書寫。
幾條規則寫在下面:
1) 一行內可以寫幾個語句,建議一行不超過兩條語句;
2) 一條語句可以寫在多行上;
3) C語句不需要寫行標號;
4) 每條語句及數據定義的後面要寫上分號以表示該語句結束;
5) C語言中注釋用 /* */來表示;
6) 建議書寫時採用縮進格式;
7) 花括弧、小括弧都是成對出現的。

一個最簡單的C程序的編寫:
/* 程序代碼*/ /* 注釋部分*/
main() /*main是主函數名。緊跟在main後面的括弧是放參數的。
括弧裡面為空說明main函數不需要參數*/
{ /*正寫的大花括弧表示main函數從這里開始*/

} /*反寫的大花括弧表示main函數到這里結束*/

說明:由於是一個演示程序,在函數體內並沒有任何可以執行的語句,也就是這個程序什麼事也不做。
這個程序就是這么簡單: 寫在一行上就是 main() { }
你在TC的編輯環境下把這段代碼輸入進去,按F9鍵編譯連接,按CTRL_F5運行,一定很正常。但是什麼結果也不會有,因為在main函數裡面什麼代碼也沒有。

下面再舉一個可以向屏幕上輸出一條信息的例子:
main()
{
printf("這就是C語言編寫的程序!"); /*這一條語句的作用是向屏幕輸出一條信息
」這就是C語言編寫的程序!"*/
}
在這個程序中,main函數只有一條語句:printf("這就是C語言編寫的程序!");這個語句的作用是向屏幕輸出一個字元串。有關這個語句的知識以後再講。現在要注意的是一個C語言程序的框架是怎樣組成的。

C語言程序的幾種文件格式:
1、 源程序---在TC集成環境中輸入的程序文本稱為源程序。源程序是一種文本文件。它是我們看得見並認識的一種文件。其擴展名為.C。例如你把文件保存為TEST,那麼在磁碟上應看得到TEST.C這個文件。這樣的文件可以用記事本打開。
2、二進制文件---寫完了源程序後接著要做的是編譯這個文件。在TC集成環境里是按ALT_F9鍵,編譯後生成了一個二進制文件,這個二進制文件名為TEST.OBJ,也就是擴展名為OBJ的目標文件。
3、運行文件---最後一步是make(或Link),在TC集成環境里是按F9鍵Make之後生成了一個可以在DOS下運行的文件,其擴展名為EXE。如TEST.EXE。這個EXE文件是由第2步中的OBJ文件生成的。OBJ文件雖然是二進制文件,而電腦又是可以運行二進制文件的,為什麼還要把OBJ文件Link為EXE文件才能運行?這里的知識就比較多了,這里不能多講。但是要明白一點,在DOS下僅僅有了一個二進制文件還不能運行,因為操作系統要把這些二進制文件加以規劃,把相應的數據、程序代碼放到應該放的內存位置,這樣的經過嚴密規劃和組織好了的二進制文件才能運行。而這些只有在生成的EXE文件裡面才做完了這些工作。

---------------------------------------

作業題:
1、下列程序中格式錯在( )處。
A. main() B. int a,b,z;
C. a=2:b=3; D. z=a+b;

分析:A,B,D 沒有錯誤。 C 中在a=2後面應該是分號而不應是":"號
答: C

2、C語言允許將一條語句寫在兩行上,下列語句不正確的是
A. int a,
B;
B. int a
,b;
C. int
a,b
D. int a,b
;
分析:C語言規定可以在語句中的任何一個分隔符或空格處換行。上面4個選項中D.有問題因為在D.中第一行的最後沒有分隔符,而第二行只有一個分號,可以看做一個語句。所以D中的錯誤為:第一行是一個獨立的語句,但是少了一個分號。
答: D
3. C語言的一行寫不下時,可以
A. 用逗號換行 B. 用分號換行
C. 在任意一空格處換行 D. 用回車符換行
分析:C語言可以在任何一個分隔符或空格處換行,所以此題的正確答案是 C
答: C
4. 下列程序段中,哪一個是錯誤的注釋方法?
A. #in/*包含*/clude<stdio.h>
void main()
{

}

B. #include<stdio.h>
void main/* */(/*主函數*/)
{

}

C. #include<stdio.h>
void main()
{ int x/*初始化*/=10;
/*列印*/printf("%d",x);
}

D. #include<stdio.h>
void main()
{
int x=10;
printf("%d",x);
/*列印x的值*」*=10*/
}
分析:根據C語言的規定:注釋不能插在標識符的中間,在其它有分隔符的地方都可以插入注釋,上面四個程序段中只有A是將注釋插入在標識符的中間了。所以A是錯誤的。
答: A

5. C語言程序是由( )組成的?
答:C程序是由函數組成的。

6. C程序運行時,運行的是什麼文件?

數據的類型:

在程序中要處理大量的數據,把這些數據按其特點分為幾種基本的數據類型,它們分別是:

1 、整型 2 、字元型 3 、實型

還有其它的一些擴展的數據類型,但是開始學習時要先熟悉這三種基本數據類型。

在 C 語言中這幾種數據類型用符號表示如下:

整型數據類型 int /* 一般指可以運算的數,如自然數就是整型數據類型 */

字元數據類型 char /* 一般指文字,如英文字母;字元類型的 '1''2''3''4' 等 */

實型 float /* 也稱作浮點型,記住 float 類型的數都是有小數位的,如 425.23*/

常量和變數:

常量――程序運行過程中其值不變的量,如一個整數 134, 一個字元 『a'

變數――程序運行過程中其值可以變化的量,如 int a; char b; 那麼 a 和 b 都是變數。

符號常量 ――用一個「符號」來表示的一個「常量」稱為「符號常量」。

符號常量有什麼好處 ――在給符號常量命名的時候,按習慣取的名字與實際上的含義相符,可以「見名識意」;另外在需要修改常量的值的時候,只需要修改符號常量的定義部分即可,非常方便。

符號常量的定義方法 ―― #define 符號 常量

例: #define NUMBER 30 /* 定義了一個符號常量,在這里是用符號 NUMBER 表示整數 30 ,以後在程序里就可以

用符號 NUMBER 代替整數 30 進行運算 */

main()

{

int a=20; /* 把常量 20 賦給整型變數 a*/

int c; /* 定義了整型變數 c*/

c=NUMBER+a; /* 變數 c 的值此時為 50 ,符號常量 NUMBER 參與了運算 */

}

變數的定義方法 ――在變數的名字前面加上一個變數的數據類型,以說明已定義的變數可以用來存放什麼樣類型的數據。

例: int a; /* 定義了一個整型變數,以後這個變數只能存放整型類型的數 */

char b; /* 定義了一個字元型變數,以後這個變數只能存放符字元型數據 */

怎樣把常量值賦給已定義了的變數 ――用一個 = 號賦值。

例: int a; /* 定義一個整型孌量 a*/

char b; /* 定義了一個字元型變數 b*/

a=20; /* 用 = 號完成賦值,賦值後變數 a 的值此時為 20*/

b='d' /* 把常量字元 'd' 賦給變數 b ,此時變數 b 的值是字元 'd'*/

變數賦值時一種更靈活的方法 ――可以在一行上給多個相同數據類型的變數賦值,變數之間用逗號分隔。

例: int a,b,c,d; /* 定義了 4 個整型變數 */

char e,f,g; /* 定義了 3 個字元型變數 */

深入理解變數 ―― 1 ) 1 個變數必須有一個變數名。 2 )變數必須有其指定的數據類型

3 )變數一旦被定義,它就在內存中佔有一個位置,這個位置稱做該 變數的地址 。

4 )每一個變數都有其對應的值。

l 一定要牢記變數的這 4 個特性。

變數使用時的注意事項 ―― 1 )變數在使用之前一定要先定義,使用一個沒有定義的變數是錯誤的。

2 )變數必須在一個函數的開始部分定義。(這個限制在 C++ 中不存在)

例題:寫一個 2 個整數相加的程序。

/* 解題思路:求 2 個整數相加,必定要先定義 2 個變數來存放這 2 個數,另外還需要 1 個變數用來存放

相加的和,所以共需要定義 3 個整型變數 */

/* 注意每次在寫 C 程序的時候一定要注意書寫格式 */

main()

{

int a,b,c;

a=20,b=30; /* 在這里指定變數的值,因為還沒有講輸入輸出函數,只能這樣了。 */

c=a+b;

}

想一想,這樣簡單的一個題,需要知道的知識面卻不少。 用到了上面所講的哪些知識?

C語言中的庫函數――我們編寫C語言程序時要寫許多代碼,這些代碼是用基本程序語句如運算符、表達式、幾種語句結構來組成。這些語句組成了多個不同的函數,由多個函數組成一個完整的程序。實際上如果程序中的語句都要由自己來寫的話,那麼工作量是很大的了。並且有一些完成基本任務的函數如輸入輸出函數是經常需要使用的。這樣的一些常用的完成基本任務的函數有許多已經由提供編譯程序的公司為我們寫好了。這些已經寫好的函數放在TC或者BC編譯器的文件中。所謂「庫函數」,就是存放「函數」的「倉庫」。在TC中,函數的「倉庫」在哪裡呢?在TC的.\LIB目錄中。編寫程序的時候,如果我們需要使用某個庫函數,就要在這個程序開頭指明這庫函數存放在哪裡,以便讓編譯程序到這個地方去找。這個指明庫函數路徑的語句稱為「包含」語句,寫做#include。完整的寫法是:
#include <stdio.h>
#include 是包含的意思,<stdio.h> 是指明要使用的庫函數在 stdio.h這個文件裡面有說明。尖括弧<>是必須要寫的。而實際上,編譯程序在stdio.h之個文件里根據庫函數名可以在.\LIB目錄下的LIB文件里找到相關的代碼,寫進程序裡面去。使用不同的庫函數時要用不同的包含,關於怎樣使用#include,可以查看庫函數的幫助。
有了眾多的庫函數,給編寫程序帶來了很大的方便。就象做房子要用磚和瓦一樣。如果沒有磚和瓦,做房子自己要挖土燒磚,可想而知,那樣做房子的難度有多大。寫程序也是這樣,有了庫函數,在需要完成某些任務時,找到相應的庫函數調用一下就可以了,不需要自己一點一點的寫代碼。在學習編程的同時要多多了解一些庫函數的特點及用法,對編寫程序是有很大的好處的。
(在Windows下編寫程序,需要了解的「庫函數」就更多了,可以說不了解庫函數就不會編程。VC中用的是MFC,Win32中用的是API,它們都是函數庫)

先了解二個庫函數――1、scanf函數 /*格式化控制台輸入函數*/
函數原型:int scanf(control_string....); /*看上去很復雜。沒關系,以後自然會明白的*/
使用例:
void main()
{
int a,b,c; /*定義了三個整型變數*/
scanf("%d%d",&a,&b); /*從鍵盤輸入二個整數到孌量a和b中*/
c=a+b; /*把變數a與b相加的和送給變數c*/
}

下面仔細講一下scanf函數各參數的用法:
可以看到在小括弧里有二個%d,後面有二個變數a和b。二個%d的寫法為"%d%d",注意凡是這樣的符號都要寫在雙引號裡面,而變數則寫在雙引號的外面並用逗號分隔。這個%d我們稱為格式化說明符,第一個%d用於說明第一個變數a,第二個%d用於說明第二個變數b,這樣的順序是一一對應的。%d格式符說明了後面輸入的變數值是整型數。
另外注意的是二個%d是靠在一起的 %d%d,凡是這樣的寫法,在輸入數時,對於二個數之間的分隔是用「空隔鍵」來實現的。如輸入30和50這二個數形式為 30 50 如果二個%d寫成%d,%d中間有一個逗號,那麼在輸入數據時也一定要在輸入的數之間加上逗號,如 30,50。
再來看一下變數的寫法,可以看到在每一個變數名的前面都有一個&號,這個&號是取變數地址的意思,那麼&a寫在一起就是變數a的地址,&b寫在一起就是變數b的地址。
上面的scanf函數的作用就是把從鍵盤上輸入的二個整數分別送到變數a和變數b的地址裡面去。這個&號是非常重要,不要寫漏了。

scanf函數的格式說明符(格式說明符說明了下一步將讀的是什麼類型的數據)
格式碼 含義
%c 讀一單字元
%d 讀一整數
%i 讀一個浮點數
%e 讀一個浮點數
%f 讀一個浮點數
%g 讀一個浮點數
%o 讀一個八進制數
%s 讀一字元串
%x 讀一十六進制數
%p 讀一指針
%n 讀一個指針收一個等於到目前為止輸入的字元數止的整數
%u 讀一無符號整數
%[] 掃描一字元集

例:從鍵盤輸入二個字元,一個大寫,一個小寫,然後把這個小寫字元轉換成大寫,大寫字元轉換成小寫。
#include<stdio.h> /*因為在程序里用到了庫函數scanf,所以要使用包含#include<stdio.h>*/
void main()
{
char ch,chh; /*定義了二個字元型變數*/
scanf("%c%c",&ch,&chh); /*從鍵盤輸入二個字元,一個大寫,另一個小寫*/
ch=ch+32; /*大寫轉成小寫*/
chh=chh-32; /*小寫轉成大寫*/
}

2、printf函數 /*格式化輸出函數*/
函數原型:int printf(const char *control_string....);
說明:printf把變數的值或常量字元串輸出到控制台(一般是顯示屏)
使用例:
#include<stdio.h>
void main()
{
int a,b,c;
scanf("%d%d",&a,&b);
c=a+b;
printf("輸出二個整數相加的和"); /*輸出字元串常量,這里沒有用到格式化說明符*/
printf("%d",c); /*把變數c的值用整型格式輸出,這里%d是整型格式說明符*/
}

如果有幾個變數的值要輸出,用這樣的形式:printf("%d %d %d",a,b,c);
從這個printf輸出的格式中看出,每一個格式符對應一個變數,其對應順序也是一一對應的,第一個%d對應第一個變數a,以此類推。注意在printf函數中,變數前面就不要加&符號了。
注意printf函數中幾個%d之間留了一些空格,這里的用法與scanf相比有一點不同。在printf函數中格式符之間留多少空隔,輸出的時候每一個輸出的值之間就有多少空隔。如printf("%d %d %d",a,b,c);輸出則為:20 30 50 (這里的數是假設的)。如果寫為printf("%d,%d,%d",a,b,c);則輸出形式為 20,30,50

printf函數的格式符:
格式碼 格式
%c 單個字元
%d 十進制數
%i 十進制數
%e 科學法表示
%E 科學法表示
%f 十進制浮點數
%g 用%e或%f中較短的的一個(如果是%e,用小寫e)
%G 用%e或%f中較短的的一個(如果是%E,用大寫E)
%o 以八進制形式輸出
%s 字元串
%u 無符號十進制數
%x 十六進制數(小寫)
%X 十六進制數(大寫)
%p 顯示一個指針
%n 相關變數是整型指針,它所指處存放至今要寫入字元的總數
%% 列印一個%號

printf函數使用例:
1)char ss="abcdefghijk"; printf("%s",ss); /*輸出一個字元串,屏幕上顯示"abcdefghijk"*/
2)unsigned int a=65535; printf("%u",a); /*以十六進制形式輸出一個無符號數,顯示為ffff*/
3)int a=123,b=456,c=687; printf("%d\t%d\n%d",a,b,c);
輸出形式為:
123 456 /*'\t'是一個製表符,所以要移動一個製表位這么多空格數*/
687 /*'\n'是換行轉義符,在前面字元常量里講過。所以要換一行再輸出687*/

C語言基礎(05-運算符和表達式):運算符(也叫操作符)--運算符是一個表示特定的數學或邏輯操作的符號。如'+'號,表示了一個相加運算;'&&'號表示了一個邏輯『與』的運算。由運算符把需要進行運算的各個量(常量或變數)連接起來組成一個表達式。
下面要講的是標準的運算符,在C++中還有另外的一些運算符。運算符 進行的運算 所屬類別 備注
[ ] 間隔符 標點符號
( ) 間隔符 標點符號
· 直接分量選擇 雙目操作符
-> 間接分量選擇 雙目操作符
++ 前增量、後增量 單目操作符
-- 前減量、後減量 單目操作符
+ 加 雙目操作符、單目操作符
- 減 雙目操作符、單目操作符
* 1)乘 2)間接引用 雙目操作符、單目操作符
/ 除 雙目操作符
% 求余 雙目操作符
& 1)位『與』2)取地址 雙目操作符、單目操作符
! 邏輯『非』 單目操作符
&& 邏輯『與』 雙目操作符
|| 邏輯『或』 雙目操作符
<< 左移位 雙目操作符
>> 右移位 雙目操作符
< 小於 雙目操作符
> 大於 雙目操作符
== 等於 雙目操作符
!= 不等於 雙目操作符
^ 位『異或』 雙目操作符
+= 和賦值 雙目操作符
-= 差賦值 雙目操作符
*= 乘賦值 雙目操作符
/= 商賦值 雙目操作符
<<= 左移賦值 雙目操作符
>>= 右移賦值 雙目操作符
&= 按位『與』賦值 雙目操作符
^= 按位異或賦值 雙目操作符
|= 按位或賦值 雙目操作符
%= 模賦值 雙目操作符
= 賦值 雙目操作符
?: 按條件取值 雙目操作符
, 間隔符 標點符號
# 預處理符號 標點符號
## 預處理符號 標點符號
sizeof 求位元組數
~ 按位求反
| 位『或』
: 間隔符
; 間隔符
... 間隔符

要把表中的運算符仔細的分類是不容易的,因為同一個運算符,在不同的地方其含義是不同的。如*運算符,當作為乘運算時是雙目操作符(所謂雙目操作符,即運算時需要二個操作數),如3*6,那麼3與6總共是二個操作數。當作為取值運算時就是單目操作符(所謂單目操作符是只需要一個操作數)如對一個數求反:!a,這里只有一個操作數a。
要記住運算符的二個特點,一個是運算符的操作對象,另一個就是運算符的優先順序別。其中運算符的優先順序別是最不容易搞清楚和最容易出錯的地方。
在講運算符之前講一下「表達式」的概念:所謂表達式,就是用運算符把各個操作數連接成符合C語法規則的進行運算的式子。這里說的「符合C語法的規則」也很重要。如 a+b+5就是一個用算術運算符連接起來的表達式。
1、算術運算符:+、-、*、/、%
1)+、-、*、/ 分別是相加、相減、相乘、相除
2)% 求二個數運算的模。所謂求模就是求二個數相除後的余數。例:25/3的余數是1,可以說25%3的模是1。要注意的是求模運算時二個操作數必須是整數。如果求25.3/3.1這樣是不能運算的。
下面寫一個例子:
#include<stdio.h> /*程序中要用到輸入輸出庫函數,所以包含了stdio.h*/
void main()
{
int a=10,b=20,c=30; /*定義了3個整型變數,並同時進行了初始化賦值*/
a=a*b+c; /*a*b+c組成了一個算術表達式,運算後的結果為230並把值*/
/*賦給變數a*/
printf("%d",a); /*以整型格式輸出變數a的值。這里輸出230*/
a=a%b; /*進行求模運算。因為沒有餘數,最後的模為0*/
printf("%d",a); /*輸出變數a的值。這里輸出0*/
}

下面是一個要考慮運算符優先順序的例子:
#include<stdio.h>
void main()
{
int a=10,b=20,c=30;
a=c-a*b; /*這里就要考慮運算符優先順序,*運算符的優先順序比-運算符*/
/*的高,所以先進行乘運算。這里最後結果為-170*/
}

由上面這個例子看到,在一個有多個運算符連接起來的表達式中需要考慮運算符的優先順序,這個例子很簡單。關於運算符優先順序的概念其實在小學生的算術運算中就有這樣的概念了,只不過這里的運算符多了一些,要考慮的情況也就復雜了。
如果這個式子改寫一下,寫成:a=(c-a)*b;在運算時就以括弧中的運算優先。

幾個簡化的運算表達式:
在C語言的程序中,經常看到這樣的運算,如:i++;或者k--;這是運算符號的簡化寫法。
1、加1運算的簡寫
當一個變數進行加1運算時,如a=a+1;這是變數自身加1,簡寫為a++;
2、減1運算的簡寫
當一個變數進行減1運算時,如a=a-1;這是變數自身減1,簡寫為a--;
3、加1個常量運算的簡寫
當一個變數與一個常量相加時,如a=a+5;這是變數自身加5,簡寫為a+=5;
4、減一個常量運算的簡寫
當一個變數與一個常量相減時,如a=a-5;這是變數自身減5,簡寫為a-=5;
5、乘一個常量運算的簡寫
當一個變數與一個常量相乘時,如a=a*5,這是變數自身乘5,簡寫為a*=5;
6、除一個常量運算的簡寫
當一個變數與一個常量相除時,如a=a/5;這是變數自身除5,簡寫為a/=5;

運算符的結合性(或稱作關聯性)
在一個復雜的表達式中,常常有許多運算符和變數,這時就要判斷優先順序和結合性這二個因素。
例:-5+7; 這樣的一個表達式用結合性來判斷,因為運算符'-'和'+'相對於運算的數來說是『左』結合的,所以就有'-5'和'+7'所以運算的結果為 2。
通過這個例子要知道什麼是「左結合性」和「右結合性」
左結合性--變數(或常量)與左邊的運算符結合
右結合性--變數(或常量)與右邊的運算符結合

運算符的優先順序和結合性表
優先順序 運算符(高 ------→低) 結合率 運算符類型
高 ( ) [ ] -> . 從左至右 雙目運算符
! ~ ++ -- (類型) sizeof + - * & 從右至左 單目運算符
* / % 從左至右 雙目運算符
+ - 從左至右 雙目運算符
<< >> 從左至右 雙目運算符
< <= > >= 從左至右 雙目運算符
== != 從左至右 雙目運算符
& 從左至右 雙目運算符
^ 從左至右 雙目運算符
| 從左至右 雙目運算符
&& 從左至右 雙目運算符
|| 從左至右 雙目運算符
?: 從右至左 三目運算符
低 = += -= *= /= %= &= ^= |= <<= >>= 從左至右 雙目運算符
高 -------------→ 低

從表中可以看出一個規律,凡是單目運算符都是「右結合」的,凡是雙目運算符都是「左結合」的。其中有一個?:運算符是三目運算符是右結合的,記住了這個規律,運算符的結合性也就掌握了。
如果代碼行中的運算符比較多,用括弧確定表達式的操作順序,避免使用默認的優先順序。
由於將表熟記是比較困難的,為了防止產生歧義並提高可讀性,應當用括弧確定表達式的操作順序。例如:
d = (high << 8) | low /*用括弧把需要先運算的括起來*/

if ((a | b) && (a & c)) /*用括弧把需要先運算的括起來*/

例:
下列程序輸出的結果是
#include<stdio.h>
void main()
{
int a=2;
a%=4-1;
printf("%d",a);
a+=a*=a-=a*=3;
printf("\n%d",a);
}

A. 2,0 B. 1,0
C. -1,12 D. 2,12

分析:由於%=運算符的優先順序別低於-運算,a%=4-1即是a%=3,等價於a=a%3即a=2%3=2,所以選項B和C是錯誤的。表達式a+=a*=a-=a*=3,計算時注意賦值類表達式的值和變數的值隨時被更新,計算表達式的值,開始時a=2,表達式賦值是從左至右進行的,表達a*=3使得a=6,此表達式的值也為6,於是表達式a-=a*=3相當於a-=6=6-6=0,a的值為0,後面的計算就不用做了,所以a的值最終為0。
答:A

下列語句中錯誤的是
A.x=sizeof int;
B.x=sizeof 3.14
C.printf("%d",a=a+1,b--,c+1);
D.printf("%d",++x,x++);
分析:此題的選項A的作用是測試int類型所佔內存的位元組數,因為類型符要用括弧括起來,這時缺少括弧是錯誤的。
選項B是正確的。
選項C從表面上看似乎復雜一些,但其中的a=a+1,b--,c+1是一個逗號表達式,C語言允許使用這種表達式所以D也是正確的。
答案:A

下面的語句中,符合C語言語法的賦值語句是
A.a=7+b+c=a+7; B.a=7+b++=a+7;
C.a=7+b,b++,a+7; D.a=7+b;c=a+7;
分析:一般情況下,表達式不能放在賦值號的左邊,所