C語言《四》 函式與程式結構

2021-07-06 03:48:45 字數 2609 閱讀 4006

如果函式定義中省略了返回值型別,則預設為int型別

返回值:如果某個函式從乙個地方返回時有返回值,而從另乙個地方返回時沒有返回值,該函式並不非法,但可能是一種出問題的徵兆。

程式的載入:不同系統中,儲存多個原始檔中的c程式的編譯和載入機制是不同的,這裡看下unix系統,假設有三個函式分別存放在main.c getline.c strindex.c,則可以使用命令cc main.c getline.c strindex.c 來編譯這三個檔案,並把生成的目標**分別放在檔案main.o getline.o strindex.o中,然後再把這三個檔案一起載入到可執行檔案a.out中,cc命令使用」.c」,」.o」這兩種副檔名來區分原始檔與目標檔案。

外部變數:外部變數定義在函式之外,因此可以在很多函式中使用,如果兩個函式必須共享某些資料,而這兩個函式互相不呼叫對方,這種情況下最方便的方式就是把這些共享資料定義為外部變數,而不是作為函式引數傳遞。可以通過乙個加減法的例子來說明,

作用域規則:外部變數或函式的作用域從宣告它的地方開始,到其所在的檔案的末尾結束。注意如果要在外部變數的定義之前使用該變數,或外部變數的定義與變數的使用不在同乙個原始檔中,則必須在相應的變數宣告中強制性地使用關鍵字extern,所以一般加了extern的就是變數的宣告

變數宣告和定義是不一樣的,宣告*用於說明變數的屬性(主要是變數的型別)變數的定義除此之外還將引起儲存器的分配在乙個原始檔的所有原始檔中,乙個外部變數只能在某乙個檔案中定義一次,而其他檔案可以通過extern宣告來訪問它,這裡說一下,外部變數的定義必須指定陣列的長度,但extern宣告則不一定要指定陣列的長度。下面舉乙個例子看看:函式push定義在file1檔案中,而變數val定義在file2檔案中並被初始化,則需要通過下面這些定義和宣告把這些函式和變數繫結在一起:

在檔案file1中:

extern

int val;

void push();

在檔案file2中

int val = 0;

靜態變數static關鍵字:如果函式宣告為static型別,則該函式名除了對該函式宣告所在的檔案可見外,其他檔案都無法訪問;若static宣告變數,則它將一直存在,並只會初始化一次,且不會隨著函式的結束而消失。

暫存器變數:register宣告告訴編譯器,它所宣告的變數在程式中使用頻率較高。其思想是:將register變數放在暫存器中,這樣可以使程式更小,執行速度更快。但編譯器可以忽略此項。register宣告只使用與自動變數以及函式的形式引數。(了解下就好)

初始化

預處理器是編譯過程中單獨執行的第乙個步驟,最常用的是:#include 和 #define

- include

#include 「檔名」 或 #include 《檔名》 若是用引號引起來的,則在原始檔所在的位置查詢該檔案;如果用<>則按相應規則來查詢檔案

- 巨集替換

如果乙個較長的巨集定義分成若干行,這時需要在待續的行末尾加*反斜槓*用於換行,注意巨集定義可能出錯哦,但是還是很有用的,如

#define

dprint(expr)

printf(#expr "=%g\n",expr)

dprint(x/y);

呼叫該巨集時,被擴充套件為

printf("x/y"

"=%g\n",x/y);

等價於printf("x/y =%g\n",x/y);

預處理運算子##為巨集擴充套件提供了一種連線實際引數的手段。如果替換文字中的引數與##相鄰,則該引數將被實際引數替換,##與前後的空白符將被刪除,並對替換後的結果重新掃瞄

#define paste(front,back) front ## back

paste(name,1) 就是name1

可以使用條件語句對預處理本身進行控制,這種條件語句的值是在預處理執行的過程中進行計算。#if 語句對其中的常量整型表示式(其中不能包含sizeof、型別裝換或enum常量),若該行不等於0,則包含其後的行,直到#endif、#elif或#else語句位置,在#if語句中可以使用#define .

下面看兩個例子吧。

#if !defined(hdr)

#define hdr

hdr.h檔案的內容放在這裡

#endif

#if system == sysv

#define hdr "sysv.h"

#elif system == bsd

#define hdr "bsd.h"

#elif system == msdos

#define hdr "msdos.h"

#else

#define hdr "default.h"

#endif

#include hdr

第乙個例子是為了避免重複包含,第二個例子根據變數的值確定包含哪個版本的標頭檔案

筆記 C語言 函式與程式結構

函式的定義形式如下 返回值型別 函式明 引數宣告表 函式定義中的各構成部分都可以省略。最簡單的函式如下所示 dummy 該函式不執行任何操作也不返回任何值。這種不執行任何操作的函式有時很有用,它可以在 程式開發期間用以保留位置 留待以後填充 如果函式定義中省略了返回值型別,則默 認為 int 型別。...

C語言程式結構

接下來就是逐條分析 1 在預處理指令中主要需要注意的是 include和 include stdio.h 是有區別的,籠統的說就是被包含與包含的關係。2 主函式注意定義型別,定義型別與最後的return對應,用於接收return的值 例如 include stdio.h int main 這裡的in...

c語言程式結構

1.順序結構 順序控制結構的一般形式如下 2.選擇結構 if語句 一般形式為 if 表示式 語句 其功能是如果表示式的值為真,則執行後面語句的相應操作,反之,如果表示式的值為假,則不會執行後面語句的相應程式。注意if語句後面不需要加分號。注意 if a if a 0 這兩種 的判斷中都有a變數,a值...