[C/C++]重读《The C Programming Language》
第一次讀這本書的時候是大三初,現(xiàn)在打算重讀一遍!。
第一章 導(dǎo)言
1. 學(xué)習(xí)一門新程序設(shè)計(jì)語言的唯一途徑就是用它來寫程序。
2. 每個程序都從main函數(shù)的起點(diǎn)開始執(zhí)行。
3. 在C語言中,所有變量必須先聲明后使用。
4. C語言中的基本數(shù)據(jù)類型的大小取決于具體機(jī)器。
5. 在允許使用某種類型變量值的任何場合,都可以使用該類型的更復(fù)雜的表達(dá)式。
6. 標(biāo)準(zhǔn)庫的輸入/輸出模型是按照字符流的方式處理,每行字符都有0個或者多個字符組成,末尾是換行符。
7. 函數(shù)為計(jì)算的封裝提供了一種簡便的方法,函數(shù)都是通過傳值調(diào)用。?
#include <stdio.h> // 文件復(fù)制 int main() {int c;while ((c = getchar()) != EOF) {putchar(c);}return 0; } /** 編寫一個將輸入復(fù)制到輸出的程序,* 并將其中連續(xù)的多個空格用一個空格代替.*/ #include <stdio.h>int main() {int c;int flag = 0; // 當(dāng)前字符是否為空格while ((c = getchar()) != EOF) {if ((c == ' ' && flag == 0) || (c != ' ')) {putchar(c);flag = !flag;} } return 0; } #include <stdio.h>#define IN 1 // 單詞內(nèi) #define OUT 0 // 單詞外// 統(tǒng)計(jì)行數(shù), 單詞數(shù)和字符數(shù) int main() {int c;int numLines = 0; // 行數(shù)int numWords = 0; // 單詞數(shù)int numCharacters = 0; // 字符數(shù)int state = OUT;while ((c = getchar()) != EOF) {++numCharacters;if (c == '\n') {++numLines;}if (c == ' ' || c == '\t' || c == '\n') {state = OUT;} else if (state == OUT) {state = IN;++numWords;}}printf("%d\t%d\t%d\n", numLines, numWords, numCharacters);return 0; } #include <stdio.h> #define MAXLINE 1000 /** 讀入一行字符*/ int getline_s(char *s, int lim) {int c, i;for (i = 0; i < lim - 1 && (c = getchar()) != EOF && c != '\n'; ++i) {s[i] = c;} if (c == '\n') {s[i] = c;++i;} s[i] = '\0';return i; }/** 拷貝數(shù)組*/ void copy(char *to, char *from) {int i = 0;while ((to[i] = from[i]) != '\0') {++i;} }int main() {int len;int max = 0;char line[MAXLINE];char longest[MAXLINE];while ((len = getline_s(line, MAXLINE)) > 0) {if (len > max) {max = len;copy(longest, line);} } if (max > 0) {printf("%s\n", longest);} return 0; }第二章 類型,運(yùn)算符與表達(dá)式
1. 變量名不要以下劃線開頭,以避免與標(biāo)準(zhǔn)庫的沖突。
2. 數(shù)據(jù)類型及描述,此外還可以在這些基本數(shù)據(jù)類型上加上一些限定符,例如short和long等。
| 數(shù)據(jù)類型 | 描述 |
| char | 字符型,占用一個字節(jié),可以存放本地字符集的一個字符 |
| int | 整型,通常反映所用機(jī)器中整數(shù)最自然的長度 |
| float | 單精度浮點(diǎn)數(shù) |
| double | 雙精度浮點(diǎn)數(shù) |
3. short與int類型至少為16位,而long類型至少為32位,并且short類型不得長于int類型,而int類型不得長于long類型。
4. 有關(guān)類型長度定義的符號常量以及其他與機(jī)器和編譯器有關(guān)的屬性可在<limits.h>和<float.h>中找到。
5. 常量表達(dá)式在編譯時求職,不在運(yùn)行時求值。(#define)
6. 字符串常量就是字符數(shù)組。
7. 枚舉常量: enum boolean{NO, YES}。
8. 默認(rèn)情況下,外部變量與靜態(tài)變量初始化為0,未經(jīng)初始化的自動變量的值未定義。
9. 在負(fù)操作數(shù)的情況下,整數(shù)除法截取的方向以及驅(qū)魔結(jié)果的符號取決于具體實(shí)現(xiàn)。
10. 標(biāo)準(zhǔn)庫<ctype.h>定義了一組與字符集無關(guān)的測試和轉(zhuǎn)換函數(shù)。
11. 位操作運(yùn)算符:按位與(&),按位或(|),按位異或(^),左移(<<),右移(>>)。
12. sizeof(對象長度)是運(yùn)算符,我一直以為是函數(shù)。冏
// strlen簡化版本 int strlen(const char *str) {int i = 0;while (str[i] != '\0') {++i;}return i; } // 將字符串轉(zhuǎn)換成整數(shù)值 int atoi(char *s) {int i;int result = 0;for (i = 0; s[i] != '\0'; ++i) {if (s[i] >= '0' && s[i] <= '9') {result = result * 10 + (s[i] - '0');}}return result; } unsigned long next = 1; //返回取值0~32767之間的偽隨機(jī)數(shù) int rand(void) {next = next * 110531245 + 12345;// ?return (unsigned int)(next / 65535) % 32768; }// 隨機(jī)數(shù)種子 void srand(unsigned int seed) {next = seed; } 1 // 從字符串s中刪除字符c 2 void squeeze(char *s, int c) { 3 int i, j; 4 for (i = j = 0; s[i] != '\0'; ++i) { 5 if (s[i] != c) { 6 s[j++] = s[i]; 7 } 8 } 9 s[j] = '\0'; 10 } View Code 1 // 將字符串t連接到字符串s的尾部, 假設(shè)s有足夠的空間 2 void strcat(char *s, char *t) { 3 int i, j; 4 i = j = 0; 5 while (s[i] != '\0') { 6 i++; 7 } 8 9 while ((s[i++] = t[j++]) != '\0'); 10 } View Code?第三章 控制流
1. continue語句只用于循環(huán)語句,不用于switch語句。
2. 少用goto。
1 // 希爾排序 2 void shellsort(int *v, int n) { 3 int gap; 4 int i, j; 5 int temp; 6 for (gap = n / 2; gap > 0; gap /= 2) { 7 for (i = gap; i < n; ++i) { 8 for (j = i - gap; j >= 0 && v[j] > v[j + gap]; j -= gap) { 9 temp = v[j]; 10 v[j] = v[j + gap]; 11 v[j + gap] = temp; 12 } 13 } 14 } 15 } View Code第四章 函數(shù)與程序結(jié)構(gòu)
1. register可以聲明寄存器變量,即所聲明的變量在程序中使用頻率較高,該變量被放入機(jī)器的寄存器中,使得程序更小,執(zhí)行速度更快。但編譯器可以忽略。
2. 初始化:
- 在不進(jìn)行顯式初始化時,外部變量和靜態(tài)變量都被初始化為0,而自動變量和寄存器變量的初值則沒有定義;
- 對于外部變量和靜態(tài)變量,初始化表達(dá)式必須是常量表達(dá)式,且只初始化一次;
- 數(shù)組的初始化可以再聲明的后面緊跟一個初始化表達(dá)式列表,用花括號括起來,當(dāng)數(shù)組長度大于初始化元素個數(shù)時,對于外部變量,靜態(tài)變量和自動變量來說,沒有初始化的元素被初始化為0;
- 字符數(shù)組初始化可以用一個字符串來代替用花括號括起來并用逗號分隔的初始化表達(dá)式序列。
3. 預(yù)處理器:
- 文件包含: #include "*.h" 和 #include <*.h> ;
- 宏替換: #define 名字 替換文本, 宏定義就是文本替換, #undef 取消名字的定義;
- ?條件包含: #if , #endif, #elif, #else和 #ifndef, #ifdef
第五章 指針和數(shù)組
1. ?通用指針類型void *;
2. 地址運(yùn)算符&只能用于內(nèi)存中的對象,即變量和數(shù)組元素,不能用于表達(dá)式,常量或者register類型的變量;
3. 一元運(yùn)算符*是間接尋址或者間接引用運(yùn)算符,作用于指針,用來取指針?biāo)赶虻膶ο?
4. ?數(shù)組和指針的不同: 指針是一個變量, pa = a 和 ++pa都是合法的,但是數(shù)組名不是變量, a = pa 和 ++a是非法的;
5. 類型ptrdiff_t表示兩個指針之間的差值;
6. 字符串常量是一個字符數(shù)組;
1 // 該過程沒有進(jìn)行字符串的復(fù)制,而只是涉及到指針操作 2 // c語言沒有提供將整個字符串作為一個整體進(jìn)行處理的運(yùn)算符 3 cha *pmessage; 4 pmessage = "now is the time";7. 下面兩個定義差別很大:
1 // 定義一個數(shù)組 2 char amessage[] = "now is the time"; 3 4 5 // 定義一個指針 6 char *pmessage = "now is the time";8. 在C語言中,二維數(shù)組其實(shí)是一個特殊的一維數(shù)組,數(shù)組元素按行存儲;
9. 下面兩種聲明:
// 該數(shù)組有13個元素,其中每個元素都是指向整型對象的指針 int* daytab[13];// daytab是一個指針,指向具有13個整型元素的一維數(shù)組 int (*daytab)[13];?10. strstr(s, t)函數(shù)用于返回字符串t在字符串s中第一次出現(xiàn)的位置, 否則返回NULL;
第六章 結(jié)構(gòu)
1. 結(jié)構(gòu)的初始化:
1 // Point 2 struct Point { 3 int x; 4 int y; 5 }; 6 7 struct Point pt = {320, 200};2. 粗語言提供了一個編譯時一元運(yùn)算符sizeof,用來計(jì)算任一對象的長度,不能用于條件編譯語句#if:
1 // 返回對象或者類型占用的存儲空間字節(jié)數(shù) 2 sizeof 對象 or sizeof(類型名)3. 不要認(rèn)為結(jié)構(gòu)的長度等于各成員長度之和,不同對象有不同的對齊要求,所有結(jié)構(gòu)中可能會出現(xiàn)未命名的空穴(hole);
2015-10-27更新,待續(xù)?
轉(zhuǎn)載于:https://www.cnblogs.com/skycore/p/4852220.html
總結(jié)
以上是生活随笔為你收集整理的[C/C++]重读《The C Programming Language》的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 零拷贝概念 -- linux内核
- 下一篇: LoadRunner测试下载功能点脚本(