《c primer plus》閱讀筆記
/*———————圖片是高一下學期讀完後寫的總結———————*/
第一章 概覽
第二章 C語言概述
第三章 資料和C
補充:
1.一般的,int型別儲存在計算機的一個字中。
2.數字的字首0表示八進位制數,字首0x或0X表示十六進位制數。
3.八進位制和十六進位制的格式說明符分別為%o和%x(X),若要顯示字首,則為%#o和%#x(X)。
4.一般的,short16位,long32位,
int為32位,範圍-(2^31)~+(2^31-1),即-2147483648 ~ 2147483647,極限約2.1*10^9
unsigned範圍0 ~ (2^32-1),即0~4294967295,約4.2*10^9
long long為64位,範圍-(2^63) ~ (2^63-1),即-9223372036854775808~9223372036854775807,約9.2*10^18
unsigned long long 約1.8*10^19
5.整數常量一般被視為int,不夠時用更大的型別儲存,字元常量被視為int(4位元組,儲存時位char型別1位元組),浮點常量被視為double。
6.如果希望一個較小的數不用int儲存,在數後加字尾U或LL或ULL,大小寫均可
7.在傳遞函式引數時c自動把short轉換為int,float轉換為double。
8.char型別實際儲存的是整數。
9.轉義序列需放在但或雙引號之中,表示八或十六進位制時只讀\後的3位,八進位制的0可省略,即\0oo,\ooo,\xhh。
10.c規定,float型別至少能表示6位有效數字,即至少能表示33.3333333的前6位,取值範圍至少為10^-37 ~ 10^+37。
11.一般的,float32位,double(雙精度)64位。
12.sizeof()返回值為無符號整數。
問題:
1.為什麼sizeof(‘a’)=1,而sizeof(‘ab’)=4
2.float/double和long double的%f和%Lf不能混用,任何情況,因為儲存格式不同。
而整數就不是,編譯器知道儲存的右位置以及分配的記憶體大小,故低階的用高階的格式說明符沒問題,高階的用低階的會擷取右若干位。當然,有無符號的最高位情況也不同,不可混用。
但出現的例外情況,也就是說上面的理解是錯誤的。比如char ch=128,而d和lld輸出不同。
那麼究竟是怎麼回事?如何理解?
第四章 字串與格式化輸入/輸出
補充:
1.sizeof()若為字串,返回整個陣列的大小。
2.int a= 3e12是不好的形式,e-表示法為浮點數,可能有誤差,long long a= 3e18+3很可能損失掉3,這是因為浮點精度而非型別轉換。
3.p80如果使用帶有多個說明符的scanf語句,函式在第一個出錯的地方停止讀入。
問題:
1.p80scanf中加逗號。
2.p68%a,%g。
3.p42說在傳遞函式引數時short轉int,是所有函式嗎,p70說float只在printf等轉,還有char是什麼情況
4.p73 4.10
5.p75引數傳遞真的是這樣嗎,為什麼long long ch=1,b=233;printf(“%d,%d”,ch,b);沒問題呢
第五章 運算子、表示式和語句
補充:
1.趨零截尾發生在整數除法和浮點數強制型別轉換為整數時。
2.在y=6*12+5*20中,兩個乘法先算哪個與環境有關。
問題:p105型別轉換。
第六章 C控制語句:迴圈
補充:
1.若浮點數要比較是否相等,應用fabs()函式和精度來比較。
2.負數,浮點數也為真。如bool a=-0.1;則a儲存1。
3.while()內必須有書,而可以for(;;)。
第七章 C控制語句:分支與跳轉
補充:
1.除了那些兩個運算子共享一個運算元的情況以外,C通常不保證複雜表示式的哪個部分先被求值,但C保證邏輯表示式從左向右求值。比如(a>b && b>c && c>d)一定是先求a>b的值,再b>c,最後求c>d,之後假如是(1&&0||1),因為兩個運算子共享一個運算元,而&&優先順序較高,則先算1&&0。再次說明,先優先順序,優先順序相同考慮則結合規則,這建立在兩個運算子共享同一個運算元的前提下,其他的情況除邏輯運算子外沒有保證。
問題:
1.p159前處理器代替。
第八章 字元輸入/輸出和輸入確認
第九章 函式
1.對於多原始碼檔案程式的編譯,函式原型和常量必須每個原始碼檔案中都包含,因此用包含標頭檔案來達到目的。
2.若輸入是qwer 123,則scanf%*s的效果是讀到space,放回輸入緩衝區,此時若還有%c,則讀入space。
第十章 陣列和指標
補充:
1.程式執行時變數名並不儲存,變數名是面向程式設計師的,在編譯時變數名就變成相對記憶體地址了。
2.陣列名是常量,若有int a[2];則不能a++,但可以使a[1]=8;,因為不是const int a[2]。
sizeof a為陣列的大小,sizeof &a[0]也一樣。
3.const宣告只讀變數,而非常量。
4.對指標+1的操作是使指標增加一個儲存單元,相當於加上他所指向的物件的位元組大小。
5.int a[]; a等價於&a[0]
int a[][]; a[0]等價於&a[0][0]。
6.函式原型或函式頭中,int sum(int ar[],int n) 等價於 int sum(int * ar,int n)。
7.字尾a++,先使用後+1在函式傳參也適用。
8.sizeof針對常量指標如陣列名或常量字串等是整個陣列或字串的大小。(???問題。是不是)
9.不同型別的指標不能比較大小。(why)
10.指標包含兩個方面的內容,一是實體記憶體地址,二是資料型別(包括大小和儲存方式)。
11.int a[2][4];a++和a[0]++不一樣。
12.[]優先順序高於,因此 int (*pz) [2]表示*pz指向int[2],即**pz是int,而int pz[2]表示指標陣列。
13.pz[m][n]等價於((pz+m)+n)
14.pt[2][4],則*pt == pt[0]==&pt[0][0],相當於int[4]。ch[5],ch表示這個陣列或這個陣列第一個元素的地址,兩者相當。
15.const指標不能賦給非const指標,反過來的話,只有一層間接運算可以,多層不可以。p270有些指標例項很好。
問題:
1.p261指標型別指派。
2.經過試驗,double a;然後依次a++輸出地址,發現依次+8,int依次+4,是否是普遍規律?
3.c程式指標能否修改其他程式的記憶體資料物件?
4.p274,276.
第十一章 字串和字串函式
補充:
1.32位機上指標變數佔4位元組,64位機上佔8位元組。
2.sizeof(地址)實際上為sizoeof(一個數字),根據其大小預設儲存為int,unsigned int,long long等,來分配儲存大小。
3.long long a;sizeof(a)==8.這裡的a是識別符號,標識佔據的一片記憶體區域(地址+型別(大小))。long long a=0;long long *b=&a;sizeof(b)b起識別符號作用,sizeof(*b)先算b,這個識別符號對應儲存內容為地址,*b為按照地址找到對應記憶體區域(包括地址+型別),值為longlong大小,0為longlong方式儲存,而非“0”的大小。
4.char *a=”asdfg”;a[2]=’q’;printf(“%s”,a);為什麼返回異常值且無輸出而不報錯?執行錯誤嗎?why?
5.const int * const a;中第一個表示指標指向只讀資料,不可通過指標修改值,第二個表示指標指向a,不可改指向別處。
6.scanf遇到檔案尾返回EOF,不合適的輸入返回0並跳過該條scanf語句。如int a;char b;scanf(“%d%c”,&a,&b);printf(“%c”,b);輸入w,不輸出,而把scanf語句拆成兩句則正常輸出w。
7.gets()遇到換行符停止從緩衝區讀入記憶體某地址,不儲存換行符。遇到檔案尾返回NULL,若鍵盤輸入直接鍵入換行符,正常返回引數地址。
8.fgets()第二個引數為n,則最多讀入n-1個字元(包括‘\n’,因為儲存),剩下一個儲存‘\0’。返回同gets()。p291.
9.puts()自動新增換行符,fputs()不。
10.常用字串函式:strlen(),strcat(),strncat()即使後一個數組引數過長超過限制也自動新增空字元,strcmp(),strncmp(),strcpy(),strncpy()如果源字串超過限制則不自動新增空字元,strchr(),strrchr(),strstr(),strpbrk()
11.空字元是‘\0’,而空白字元是空格換行製表。
問題:
1.p287對於補充5的解釋。
2.為什麼unsigned int a;scanf(“%u”,&a);printf(“%d”,a);可以正常。貌似?
第十二章 儲存類、連結和記憶體管理
問題:
1.多檔案時,檔案1宣告外部變數,然後在檔案2中的某一程式碼塊中用extern宣告同一變數,那麼在檔案2中該變數是程式碼塊作用域還是檔案作用域?若檔案2所有程式碼塊之外宣告同一變數不用extern,是不是遮蔽了外部連結的這個變數?
**———————————說明:此章還剩隨機數 、記憶體分配和型別限定詞未讀—————————————
/*****************半途而廢了,這是第四次讀這本書,前三次是高一下學期讀的,這次感覺不在狀態,讀了也立馬就忘,上了大學再學吧,後面的直接傳上來當時的總結。先搞演算法Algorithm去了。**************/**
第十三章 檔案輸入/輸出
第十四章 結構和其他資料形式
第十五章 位操作
第十六章 C前處理器和C庫
第十七章 高階資料表示
———————-未完待更—————————-