4 標頭檔案
5 初始化
6 c預處理器
函式定義形式如下:
//函式定義
返回值型別 函式名(引數宣告表)
//return語句
return exp;
程式:可以看作變數定義和函式定義的集合。函式之間的通訊可以通過引數、函式返回值以及外部變數進行。
被呼叫函式通過return語句向呼叫者返回值。return語句後的表示式也可以省略,此時函式不向呼叫者返回值。呼叫函式也可以忽略返回值。
外部變數定義在函式之外,可以在許多函式中使用。c語言不允許在乙個函式中定義其他函式,因此函式本身是外部的。
外部變數可以在全域性範圍內訪問,這為函式之間的資料交換提供了一種可以代替函式引數和返回值的方式。
外部變數的用途還表現在它們與內部變數相比具有更大的作用域和更長的生存期。自動變數只能在函式內部使用,從其所在函式被呼叫是變數開始存在,在函式退出時變數消失。
作用域:名字的作用域是指程式中可以使用改名字的部分。
3.1 自動變數
自動變數的作用域從宣告該變數的函式中的位置開始到函式結束。不同函式中宣告的具有相同名字的各個區域性變數間沒有任何關係。
3.2 外部變數
外部變數或函式的作用域從宣告它的地方開始到其所在檔案的末尾結束。
要在外部變數定義前使用該變數或者外部變數的定義與變數的使用不在同乙個原始檔中,則必須在相應的變數宣告中強制性使用關鍵字extern。在乙個程式的所有原始檔中,乙個外部變數只能在某個檔案中定義一次,而其他檔案可以通過extern宣告來訪問它。
外部變數的初始化只能出現在其定義中。
宣告與定義:變數宣告用於說明變數的屬性。變數定義除此之外還將引起儲存器的分配。
3.3 靜態變數
3.4 暫存器變數
register宣告的變數在程式中使用頻率較高,此宣告告訴編譯器將變數放在機器的暫存器中,可以使程式更小、執行速度更快。無論暫存器變數實際是否存放在暫存器中,它的位址都是不可訪問的。
在不進行顯式初始化的情況下,外部變數和靜態變數都將被初始化為0,而自動變數和暫存器變數的初值則沒有定義。
對於外部變數和靜態變數來說,初始化表示式必須是常量表示式,且只初始化一次。對於自動變數和暫存器變數,則在每次進入函式或程式塊時都將被初始化。自動變數和暫存器變數的初始化表示式可以不是常量表示式:表示式中可以包含任意在此表示式之前已經定義的值。
陣列的初始化表示式用花括號括起來,各初始化表示式之間通過逗號隔開。
預處理是編譯過程中單獨執行的第乙個步驟。兩個最常用的預處理指令是:#include指令(用於在編譯期間把指定檔案包含進當前檔案中)和#define指令(用任意字串行代替乙個標記)。
6.1 檔案包含
檔案包含指令使得處理大量的#define指令以及宣告更加方便。檔案包含指令將被替換為檔名指定的檔案的內容。形式:
/* 在原始檔所在位置查詢該檔案 */
#include
"filename"
/* 根據相應規則查詢該檔案 */
#include
在大型程式中,#include指令是將所有宣告**在一起的較好的方法。
6.2 巨集替換
巨集定義的形式為:#define 名字 替換文字
這是最簡單的巨集替換,後續所有出現名字記號的地方都將被替換為替換文字。可以將乙個較長的巨集定義分為若干行,此時需要在行末加上乙個反斜槓符 \ 。#define指令的作用域從其定義點開始,到被編譯的原始檔的末尾結束。替換只對記號進行,對括在引號中的字串不起作用。
//替換文字可以是任意的
#define forever for(;;)
//巨集定義也可以帶引數
#define max(a, b) ((a) > (b)) ? (a) : (b))
//引數名以#作為字首則結果中實際引數替換為該引數的帶雙引號的字串
#define dprint(expr) printf(#expr " = %g\n", expr)
printf
("x/y"
" = %g\n"
, x/y)
;/* 連線兩個引數 */
#define paste(front, back) front ## back
//呼叫paste(name, 1)的結果為name1
巨集max看起來向函式呼叫,但巨集呼叫只是將替換文字插入到**中而已。而且它有一些缺陷,比如作為引數的表示式要重複計算兩次,若表示式含有自增(減)運算子,則會出現不正確的結果。
#undef指令:用於取消名字的巨集定義。
運算子**##**:提供了一種連線實際引數的手段,##與前後的空白符將被刪除。
6.3 條件包含
使用條件語句對預處理本身進行控制,為編譯過程中根據計算的條件值選擇性地包含不同**提供了一種手段。
#if語句:對其中的常量整型表示式進行求值,若該表示式的值不等於0,則包含其後的各行。直到遇到#endif、#elif或#else語句為止。在#if語句中可以使用表示式defined(name),其含義為若該name已經定義時,其值為1,否則其值為0。
/* 保證hdr.**件內容只被包含一次 */
#if !defined(hdr)
#define hdr
#endif
//第一次包含標頭檔案hdr.h時,將定義名字hdr,此後再次包含該檔案時,會直接跳轉到#endif處
#ifndef hdr
#define hdr
#endif
#ifdef、#ifndef語句:用來測試某個名字是否已經定義。
//第一次包含標頭檔案hdr.h時,將定義名字hdr,此後再次包含該檔案時,會直接跳轉到#endif處
#ifndef hdr
#define hdr
#endif
#ifdef、#ifndef語句:用來測試某個名字是否已經定義。
函式與程式結構 例題
建立乙個逆波蘭表示法的計算器 eg 1 2 4 5 逆波蘭表示法 12 45 簡單 如下 只能完成基本的加減乘除,取模運算 include include 為了使用atof 函式 include define maxop 100 運算元或運算子的最大長度 define number 0 標識找到乙個...
C C學習筆記 函式與程式結構
返回值型別函式名 引數宣告表 宣告和語句 函式定義不能位於另乙個函式體內。如果函式定義中省略了 返回值型別 則預設為 int 型。被呼叫函式通過return語句向呼叫著返回值,return語句的後面可以跟任何表示式 return 表示式 必要時,表示式將被轉換為函式的返回值型別。表示式兩邊的括號可選...
C語言《四》 函式與程式結構
如果函式定義中省略了返回值型別,則預設為int型別 返回值 如果某個函式從乙個地方返回時有返回值,而從另乙個地方返回時沒有返回值,該函式並不非法,但可能是一種出問題的徵兆。程式的載入 不同系統中,儲存多個原始檔中的c程式的編譯和載入機制是不同的,這裡看下unix系統,假設有三個函式分別存放在main...