日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

[C/C++]重读《The C Programming Language》

發布時間:2023/12/9 c/c++ 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [C/C++]重读《The C Programming Language》 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

第一次讀這本書的時候是大三初,現在打算重讀一遍!。

第一章 導言

1. 學習一門新程序設計語言的唯一途徑就是用它來寫程序。

2. 每個程序都從main函數的起點開始執行。

3. 在C語言中,所有變量必須先聲明后使用。

4. C語言中的基本數據類型的大小取決于具體機器。

5. 在允許使用某種類型變量值的任何場合,都可以使用該類型的更復雜的表達式。

6. 標準庫的輸入/輸出模型是按照字符流的方式處理,每行字符都有0個或者多個字符組成,末尾是換行符。

7. 函數為計算的封裝提供了一種簡便的方法,函數都是通過傳值調用。?

#include <stdio.h> // 文件復制 int main() {int c;while ((c = getchar()) != EOF) {putchar(c);}return 0; } /** 編寫一個將輸入復制到輸出的程序,* 并將其中連續的多個空格用一個空格代替.*/ #include <stdio.h>int main() {int c;int flag = 0; // 當前字符是否為空格while ((c = getchar()) != EOF) {if ((c == ' ' && flag == 0) || (c != ' ')) {putchar(c);flag = !flag;} } return 0; } #include <stdio.h>#define IN 1 // 單詞內 #define OUT 0 // 單詞外// 統計行數, 單詞數和字符數 int main() {int c;int numLines = 0; // 行數int numWords = 0; // 單詞數int numCharacters = 0; // 字符數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; }/** 拷貝數組*/ 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; }

第二章 類型,運算符與表達式

1. 變量名不要以下劃線開頭,以避免與標準庫的沖突。

2. 數據類型及描述,此外還可以在這些基本數據類型上加上一些限定符,例如short和long等。

數據類型描述
char字符型,占用一個字節,可以存放本地字符集的一個字符
int整型,通常反映所用機器中整數最自然的長度
float單精度浮點數
double雙精度浮點數

3. short與int類型至少為16位,而long類型至少為32位,并且short類型不得長于int類型,而int類型不得長于long類型。

4. 有關類型長度定義的符號常量以及其他與機器和編譯器有關的屬性可在<limits.h>和<float.h>中找到。

5. 常量表達式在編譯時求職,不在運行時求值。(#define)

6. 字符串常量就是字符數組。

7. 枚舉常量: enum boolean{NO, YES}。

8. 默認情況下,外部變量與靜態變量初始化為0,未經初始化的自動變量的值未定義。

9. 在負操作數的情況下,整數除法截取的方向以及驅魔結果的符號取決于具體實現。

10. 標準庫<ctype.h>定義了一組與字符集無關的測試和轉換函數。

11. 位操作運算符:按位與(&),按位或(|),按位異或(^),左移(<<),右移(>>)。

12. sizeof(對象長度)是運算符,我一直以為是函數。冏

// strlen簡化版本 int strlen(const char *str) {int i = 0;while (str[i] != '\0') {++i;}return i; } // 將字符串轉換成整數值 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之間的偽隨機數 int rand(void) {next = next * 110531245 + 12345;// ?return (unsigned int)(next / 65535) % 32768; }// 隨機數種子 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的尾部, 假設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語句只用于循環語句,不用于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

第四章 函數與程序結構

1. register可以聲明寄存器變量,即所聲明的變量在程序中使用頻率較高,該變量被放入機器的寄存器中,使得程序更小,執行速度更快。但編譯器可以忽略。

2. 初始化:

  • 在不進行顯式初始化時,外部變量和靜態變量都被初始化為0,而自動變量和寄存器變量的初值則沒有定義;
  • 對于外部變量和靜態變量,初始化表達式必須是常量表達式,且只初始化一次;
  • 數組的初始化可以再聲明的后面緊跟一個初始化表達式列表,用花括號括起來,當數組長度大于初始化元素個數時,對于外部變量,靜態變量和自動變量來說,沒有初始化的元素被初始化為0;
  • 字符數組初始化可以用一個字符串來代替用花括號括起來并用逗號分隔的初始化表達式序列。

3. 預處理器:

  • 文件包含: #include "*.h" 和 #include <*.h> ;
  • 宏替換: #define 名字 替換文本, 宏定義就是文本替換, #undef 取消名字的定義;
  • ?條件包含: #if , #endif, #elif, #else和 #ifndef, #ifdef
1 // 使用遞歸打印十進制數n 2 void printd(int n) { 3 if (n < 0) { 4 putchar('-'); 5 n = -n; 6 } 7 8 if (n / 10) { 9 printd(n / 10); 10 } 11 12 putchar(n % 10 + '0'); 13 } View Code // 快速排序 void qsort(int *v, int left, int right) {int i, last;if (left >= right) return ;swap(v, left, (left + right) / 2); last = left;for (i = left + 1; i <= right; ++i) {if (v[i] < v[left]) {swap(v, ++last, i); } } swap(v, left, last);qsort(v, left, last - 1); qsort(v, left + 1, right); } View Code

第五章 指針和數組

1. ?通用指針類型void *;

2. 地址運算符&只能用于內存中的對象,即變量和數組元素,不能用于表達式,常量或者register類型的變量;

3. 一元運算符*是間接尋址或者間接引用運算符,作用于指針,用來取指針所指向的對象;

4. ?數組和指針的不同: 指針是一個變量, pa = a 和 ++pa都是合法的,但是數組名不是變量, a = pa 和 ++a是非法的;

5. 類型ptrdiff_t表示兩個指針之間的差值;

6. 字符串常量是一個字符數組;

1 // 該過程沒有進行字符串的復制,而只是涉及到指針操作 2 // c語言沒有提供將整個字符串作為一個整體進行處理的運算符 3 cha *pmessage; 4 pmessage = "now is the time";

7. 下面兩個定義差別很大:

1 // 定義一個數組 2 char amessage[] = "now is the time"; 3 4 5 // 定義一個指針 6 char *pmessage = "now is the time";

8. 在C語言中,二維數組其實是一個特殊的一維數組,數組元素按行存儲;

9. 下面兩種聲明:

// 該數組有13個元素,其中每個元素都是指向整型對象的指針 int* daytab[13];// daytab是一個指針,指向具有13個整型元素的一維數組 int (*daytab)[13];?

10. strstr(s, t)函數用于返回字符串t在字符串s中第一次出現的位置, 否則返回NULL;

第六章 結構

1. 結構的初始化:

1 // Point 2 struct Point { 3 int x; 4 int y; 5 }; 6 7 struct Point pt = {320, 200};

2. 粗語言提供了一個編譯時一元運算符sizeof,用來計算任一對象的長度,不能用于條件編譯語句#if:

1 // 返回對象或者類型占用的存儲空間字節數 2 sizeof 對象 or sizeof(類型名)

3. 不要認為結構的長度等于各成員長度之和,不同對象有不同的對齊要求,所有結構中可能會出現未命名的空穴(hole);

2015-10-27更新,待續?

轉載于:https://www.cnblogs.com/skycore/p/4852220.html

總結

以上是生活随笔為你收集整理的[C/C++]重读《The C Programming Language》的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。