下面把我這半年來記的一些C語言的筆記貼出來。
1 C語言中函數參數傳遞是按照“值傳遞”進行的,即單向傳遞。
2 函數原型:函數類型 函數名(參數類型,參數類型……),可以不必加參數名,因為操作系統不檢查參數名。
3 數組作為實參傳遞,型參若也是數組聲明,可以第一維不指定數組大小,此時這個數組已經退化為一個指針,因此數組長度需要在參數當中接收。局部引用型參數組名的時候,其實它已經不是數組而只是一個指針。
4 函數定義不可以嵌套
5 型參中的數組定義,可以不指定一維數組的大小,指定了也不起作用。C編譯器對型參數組大小不做檢查,只是將實參數組首地址傳遞給了型參。故,兩個數組名的指針一致。兩個數組共同占用一段內存單元。多為數組名作參數可以忽略一維數組的大小,但是不能忽略二維及高維的大小聲明,C編譯器不檢查第一維的大小。
6 動態存儲方式與靜態存儲方式:靜態存儲指程序運行期間分配固定的存儲空間的方式,而動態存儲是根據需要動態分配管理的方式。全局變量存儲在靜態存儲區,而靜態局部變量亦是如此。使用static聲明的全局變量表示其作用域只是本文件當中,而不可以被其它文件使用 “extern”聲明後 引用,同樣的static型函數。
7 只有局部變量和型參可以作為寄存器變量。別問為什麼,理由自己去想!
8 使用“extern”聲明外部變量,編譯時將外部變量分配在靜態存儲區。
9 使用“extern”聲明一個外部變量,可以是本文件中的,此時適用的情況就是“適用處位於聲明處之前”。或者是在其它文件中進行查找:extern int a; 或者 extern a; 查找先是在本文件當中進行的,然後是外部文件。
10 預處理命令,它們並非C語言的一部分。
11 a[i] 與 *(a+i)效率相同而內部處理是將 a[i]轉化為 *(a+i);
12 java當中構造方法不能被子類繼承,若子類需要調用父類帶參構造方法需要使用 super()方法。正常編譯器會自動調用父類的無參構造方法。顯示的通過super()父類成員。
13 java當中構造方法的第一條語句可以為this調用,即通過適用this加參數,調用其它的構造方法。
14 C語言的數據類型大體可以分為四種:基本類型(整型、字符型、實型、枚舉類型),構造類型(數組、結構體、共用體),指針類型,空類型。
15 在Turbo C中一個int型變量最大允許值32767,如果將其加1,則會溢出,變為-32768。
16 如果一個整常數後面加一個字母,u或U,則認為是unsigned int型。如12345u,在計算機中按照unsigned int 存儲。存儲單元中最高位不作為符號位,而用來存儲數據。如果數字為123L,表示long int。
17 float 4個字節,有效數字6-7位。 double 8個字節,有效數字位數15-16位。
18 實型數據的捨入誤差。%f為輸出一個實數的格式符。看下面的程序:
main()
{
float a, b;
a=123456.789e5;
b=2+20;
printf("%f", b);
}
實型變量只能保證7位有效數字,後面的數字是無意義的,並不准確。此時輸出a,b都為12345678848.000000 。類似的如果輸出1.0/3*3,那麼看到的輸出並不等於1
實型常量,C編譯系統作為雙精度處理。
19 如果i=3,printf(“%d”, -i++),則先取i的後置自增,返回結果3,之後取負,輸出雖然是-3,此時i為4.
20 變量“先定義後使用”原則的好處:確保程序變量名使用得正確,類型確定,在編譯時就能為其分配相應的存儲單元;有利於編譯時進行運算的合法性檢查。
21 如果 float a = 4.5; 那麼 (int)a/1.5 結果為2.66……而不是3,這說明了運算的順序先進行類型的轉化在進行除運算。