C C 語言拾遺 一 變數與巨集定義

2021-09-02 18:03:40 字數 1329 閱讀 8857

答:c程式可以由多個原始檔組成。乙個檔案中定義全域性變數,其他的檔案中可以使用extern方式宣告後,使用該全域性變數。如果希望當前檔案中的全域性變數不能被其他檔案使用,可以在全域性變數的定義前加上關鍵字static,這樣該全域性變數就是乙個static全域性變數。​

​1) 靜態區域性變數屬於靜態儲存類別,在靜態儲存區內分配儲存單元。在程式整個執行期間都不釋放。而自動變數(即動態區域性變數)屬於動態儲存類別,佔動態儲存空間,函式呼叫結束後即釋放。

2) 靜態區域性變數在編譯時賦初值,即只賦初值一次;而對自動變數賦初值是在函式呼叫時進行,每呼叫一次函式重新給一次初值,相當於執行一次賦值語句。

3) 如果在定義區域性變數時不賦初值的話,則對靜態區域性變數來說,編譯時自動賦初值0(對數值型變數)或空字元(對字元變數)。而對自動變數來說,如果不賦初值則它的值是乙個不確定的值。

#define max(a,b) (a>b)?a:b​

這是與函式中的情況不同的。在函式中,形參和實參是兩個不同的量,各有自己的作用域,呼叫時要把實參值賦予形參,進行「值傳遞」。而在帶參巨集中,只是符號代換,不存在值傳遞的問題。​

#define sq(y) (y)*(y)​

sq=160/sq(a+1);​

input a number:3

sq=160​

為什麼會得這樣的結果呢?分析巨集呼叫語句,在巨集代換之後變為:

​sq=160/(a+1)*(a+1);​

(巨集定義在預編譯階段進行「巨集代換」或「巨集展開」)​

1. 第一種形式:

#ifdef 識別符號

程式段1

#else

程式段2

#endif​

2. 第二種形式:

#ifndef 識別符號

程式段1

#else

程式段2

#endif​

3. 第三種形式:

#if 常量表示式

程式段1

#else

程式段2

#endif​​

例如對陣列a[5][3]:

1) 按行分段賦值可寫為:

int a[5][3]=,,,, };

2) 按行連續賦值可寫為:

int a[5][3]=;​

char c=;   或去掉{}寫為:char c="c program";​

用字串方式賦值比用字元逐個賦值要多佔乙個位元組, 用於存放字串結束標誌'\0'。

指標方式:

char *ps; 賦值   ps="c language";

而對陣列方式:

char st[20]; 不能賦值:st=;

而只能對字元陣列的各元素逐個賦值。char st=;

C 拾遺(一) 變數和基本型別

今天看到乙個小小的演算法,交換兩個數卻不引入中間變數,想了下沒什麼思路。看了答案是這樣 1 inta,b 2 a a b 3 b a b 4 a a b 感覺還是挺有想法的,藉此也引起我對語言的重新審視。考慮到年後去學校應該要參加招聘,可能要對以前所學進行全面的複習。當然第一步就是對程式語言的了解,...

《高質量C C程式設計指南》糾錯與拾遺 一

使用 c c 程式設計的程式設計師,幾乎都看過林銳博士寫的 高質量 c c 程式設計指南 這篇百頁經書,並且通過閱讀這篇百頁經書,受益匪淺。我也是這篇文章的受益者。通過這篇百頁經書,我學到很多知識,也給於了我深入學習 c 的動力。最近,偶得機會,再次拜讀林銳博士的 高質量 c c c c c c 程...

乙個小小的C語言巨集定義錯誤 C,C

define aaa 1 define bbb 2 int addde int main int argc,char argv 竟然會提示c2100錯誤。百思不解,用加號 代替 就沒有錯誤,原因何在?查了一下msdn 對c2100錯誤的解釋是,後面是乙個非指標變數。大惑,乘號怎麼被看成了指標取值?後...