C語言之c語言基礎知識

2021-09-24 11:54:49 字數 1354 閱讀 9318

1,「\」引起的錯誤:

在我們現在的編譯器中如果寫下面這段程式

int main()
編譯就會用字元的顏色來提示我們,這兩行內容都被當做了注釋的內容,但是如果在vim下編寫程式,就不會出現**顏色不一樣的問題,導致程式出錯,是什麼原因呢,是因為""的問題,它在c++或者python語言中,代表的含義都是本行尚未結束,下一行仍和本行是乙個整體,所以編譯器會認為,兩行都是注釋,最終導致錯誤。

2, 想想這個表示式: y = x/ p 他的結果是什麼呢? 有可能是x的值除以 p的值的結果賦給y,但是在實際編譯中會出錯,為什麼? 因為編譯器會把 / 當成注釋的開始,之後的內容都是注釋,但是要結束注釋需要找到匹配的 /,但是沒有找到,所以編譯會出錯。如果向改正程式的話,在/, * 之間加乙個空格,或者給他們加乙個(),就解決了。

3, #define pchar char*

pchar p1, p2;

typedef char* pchar;

pchar p3, p4;

那sizeof p1, p2, p3, p4都是什麼呢,結果是4, 1, 4, 4,結果很奇怪吧,原因要追溯到編譯器對#define的處理,是對#define定義的東西在預編譯的時候進行替換,也就是說真正編譯的時候是這個樣子 char * p1, p2;這樣該明白p2的值是1的原因了吧。

4,enum enum_value enum_val;

測試一下sizeof enum_val的值,看是多少,你會發現是4,其實這個原因很簡單,enum 定義的變數只是乙個uint型別,而它生命的value_one,value_two, 只是enum變數的取值範圍而已,所以enum不是像struct那樣是個結構體,它表示的只是乙個集合。

5, #define,因為在預編譯的時候就會做替換,所以他不會導致不必要的記憶體分配。同時巨集看起來像乙個函式,但不會招致函式呼叫不必要的開銷。

在定義巨集的時候,必須記住為所以得實參加上小括號,但即使加上了小括號,也會遭遇麻煩:

看看下面的呼叫:

int a = 5, b = 10

call_with_max(++a, b)

call_with_max(++a, b + 10) 把實參替換一下就可以看到,a的遞增次數取決於它被拿來和誰比較。

6, int a[6], sizeof(a[6]) 為什麼不會出錯? 因為sizeof 是乙個關鍵字,關鍵字求值是在編譯的時候,雖然並不存在a[100]這個元素,但是這裡並沒有真正的去訪問a[6], 而是僅僅根據資料元素的型別確定其值。 那麼函式引用a[6]就會出錯,是因為函式求值是在執行的時候。

C語言之基礎知識 防備忘

序號 知識點 整型 1c語言的識別符號,只能由字母 數字和下劃線組成,且第乙個字元必須為字母或者下劃線 2大寫字母和小寫字母認為是兩個不同的字元 3計算機記憶體中,整數是以補碼的形式存在的 4正整數 原碼 反碼 補碼相同 原碼即為十進位制轉為二進位制 5負整數 原碼,符號位為1。反碼,符號位為1,其...

C語言基礎知識

1 的問題。int i 1 int j 2 int k i j printf d k 輸出k為3。編譯原理有關編譯器在詞法解析的時候,對於運算子,總是查詢最大的匹配也就是說,i j,編譯器在找到 的時候,它不立即理解為 而是繼續下乙個字元,下乙個字元仍然是 可以組成 再往下的話便是 不成立了。所以i...

C語言基礎知識

一 位元組對齊 位元組對齊的原因,是機器在訪問記憶體中儲存的資料的高效性。通常機器是機器位數為自然邊界來訪問記憶體的,如果乙個4位元組整形數,所在的記憶體不在虛擬記憶體的自然邊界。則cpu需要讀多於一次的資料,這樣就降低了效率。所以,簡單地說,就是保證cpu指令在訪問資料的時候,能一次讀取,而不需要...