關於C語言的一些總結

2022-03-11 19:37:55 字數 2284 閱讀 4132

最近看了一些書籍,總結一下程式設計師容易忽略的程式設計細節吧,對面試還是考試有幫助的,不斷更新中。

1.    sizeof

想必大家都知道這個關鍵字吧,不是函式哦,凡是在c\c++編輯器了有和其它關鍵字有相同顏色的單詞都是關鍵字,這是乙個計算型別或者變數在記憶體中的佔位大小,當是型別時如sizeof(int),就是int型別佔記憶體的大小是4位元組,這裡要加括號哦,接著如果是變數,如果有int a = 1, 那麼你也可以不用括號, 比如 sizeof a,注意中間有空格總結一下,跟在sizeof後面的是型別時一定要括號,還有是多個運算元時表示式時也要加,當是乙個變數時就可以不加。但是為了少犯錯誤,一般都加上吧,絕對錯不了。

好,接著來說一些大家少知道的吧,前面有說的表示式時,不知道大家有沒有試過,比如有

int a = 1;       int b = 1;      a = sizeof(b = a + 1);      printf("%d %d\n", a, b);

結果是4 1;

不會吧,這是為什麼啊,b不是賦值了嗎?呵呵,其實這很簡單,就是sizeof的屬性,對於表示式是不用求值的,只要知道其型別就知道其所佔空間多少了,所以表示式裡就可以不用算了,如果sizeof後面是陣列名,那就是陣列的佔記憶體的大小。

2.register

暫存器變數,有時為了加快程式的執行速度,定義暫存器變數是個方法,但是可能有時候情況和你沒這麼做效果是一樣的,當沒有多餘的暫存器讓你用了,編譯器就會忽略這個聲名,只當它是普通變數如:register a = 1;聲名變數a是暫存器變數。

這個大家都懂,可這有什麼問題麼?有,暫存器變數是存在暫存器裡的對不?對,那又有什麼問題呢?問題大了,比如說如果我要聲名乙個static變數呢?我又想加快執行速度,那就來吧,static register a;這行麼?很遺憾,編譯報錯,這是因為儲存的位置不能是乙個變數分身兩個不同位址吧,static變數是儲存在資料段裡面的,register變數是儲存在暫存器裡面的,暫存器是位於cpu附近的,就像eax這樣,既然這樣,那麼好像很多問題都湧發而來了,是關於sizeof和static的,看下面吧

3.static

我之前有兩篇自己總結的結構體占記憶體和位元組對齊的文章,講得也很少,不過夠用行,但是還沒說明也許細節,在這裡講了算了,懶得回去改了(雖然之前那兩篇改了好幾次)

當我聲名乙個結構體變數時,注意這是在c++環境中,如果在gcc編譯器裡是會報錯的,如下

struct 

int a;

static  int b;

}c;sizeof(c) =  4;

咦?那b佔的記憶體**去了,呵呵上面register的時候就說過了,static變數是放在資料段裡面的,和其它變數是區分開的,所以無論你是定義全域性的struct還是區域性的,都是不占用struct變數的記憶體,這是在c++環境中的,得用g++編譯器,但是有個問題沒解決,就是怎麼使用b 啊, c.a可以,但是c.b就報錯了,其實我也不知道怎麼使用,求大神解釋。網上看了一些文章,網友們說這意義不大,一般沒人會這麼定義的,而是直接定義static struct,這樣他的成員都是static,不知道對不對,以後再考證。

4.為什麼陣列不設邊界檢測呢?像字串陣列一樣,以'\0'來結束多好

呵呵,對啊,但是它就不那麼做,原因是為了

1.提高編譯器的速度,減輕編譯器的負擔

2.可以提高指標的靈活性,當乙個指標指向陣列時,指標就相當於陣列來使用了,如果帶有邊界檢測,那麼資訊存在**呢?陣列頭?那指標怎麼存?像字元陣列那樣在最後面加個0識別?拜託,那整形怎麼辦?你想太多了,在實現上沒必要考慮那麼多,只要能用就行了,

3.當初c編譯器就是沒有帶檢測的,現在也沒有,所以這就只增加程式設計師的負擔而已,機器是蠻爽的。呵呵!!

大家有問題的可以說,討論討論,這也是我在網上看別人的總結來的。

5.陣列越界問題

看下面**,都是對乙個陣列初始化過程

1.#define  len   5

int a[len];     int *p = null;     for (p = &a[len]; p > &a[0];)         *--p = 0;

2.#define  len   5

int a[len];    int *p = null;

for (p = &a[len-1]; p >= &a[0]; p--)         *p = 0;

看了上面兩個**有什麼問題嗎?其實只有**2有問題。因為c標準中,允許指向同乙個陣列的針像比較運算,但是只允許陣列最後乙個元素位址和其後乙個越界位址比較,而沒有說明可以開始的第乙個元素位址和陣列前乙個位址比較。大多數編譯器也許可以執行沒出錯,但是在移植**過程中,如果出錯就很難想象後果了,c標準有機會的話還是要看下的,不然都不知道竟然還有這種規定。

一些關於C語言的總結

看到一哥們寫的筆記,感覺不錯就拿過來了。本想加到網摘裡邊,可搗騰了半天就沒有發現加網摘的鏈結,最後還是寫到自己的部落格中吧!總結1 char ch 12345 char ch 12345 char ch puts printf s char ch 必須有單引號 scanf n a gets a 空格...

C 關於多型的一些總結

多型按字面的意思就是多種形態。當類之間存在層次結構,並且類之間是通過繼承關聯時,就會用到多型。c 多型意味著呼叫成員函式時,會根據呼叫函式的物件的型別來執行不同的函式。1 什麼是多型 2 多型有什麼用 3 多型的原理是什麼 4 如何實現多型 5 c 的純虛函式 2 多型是物件導向的重要技術之一,它是...

關於C語言大作業的一些提示和一些C語言的庫函式

1 俄羅斯方塊的基本方塊由以下7種組成 也可以自行增加種類 可使用乙個三維的陣列來表示這七種基礎方塊。庫是c c 中的日期和時間標頭檔案。用於需要時間方面的函式。用於生成隨機數。srand函式隨機數發生器的初始化函式,使用的時候用rand i函式獲得0 i 1之間的隨機數,其中i為整數 一般初始化 ...