第一次读这本书的时候是大三初,现在打算重读一遍!。

第一章 导言

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》相关推荐

  1. 不忘初心 --- 重读The C Programming Language

    这篇文章应该发布在好几年前,2011年计算机界大师Dennis Ritchie仙逝.那时对大师的映象还停留在大一刚学编程时:Unix的合作开发者:C语言的发明人.通过网上的纪念文章<<Un ...

  2. R语言(The R Programming Language)

    R是用于统计分析.绘图的语言和操作环境.R是属于GNU系统的一个自由.免费.源代码开放的软件,它是一个用于统计计算和统计制图的优秀工具. R是统计领域广泛使用的诞生于1980年左右的S语言的一个分支. ...

  3. 《The C Programming Language》读书笔记 说明

    <The C Programming Language>读书笔记 说明 作为笔记而言,完全是一种自写自看的行为,本来是没有必要写这篇东西的.但是作为一个生活在网络时代的学 生来说,想学好一 ...

  4. 《The C Programming Language》(2nd Ed) Introduction 翻译

    <The C Programming Language>(2nd Ed) Introduction 翻译 说明: 1.       本人非专业翻译人员,信达雅三种境界,可以达到" ...

  5. [iOS翻译]《The Swift Programming Language》系列:Welcome to Swift-01

    本文转载至:http://www.cnblogs.com/yangfaxian/p/3765081.html 全书目录: 一.Welcome to Swift 二.Language Guide 三.L ...

  6. Ada 程序设计语言(The Ada Programming Language)[第二集]

    Ada 程序设计语言(The Ada Programming Language)[第二集]- -   2.5.2 通用离散类型属性 离散类型包括整型和枚举型,除了上述的属性外,还有: S'Pos   ...

  7. C: Answers to “The C programming language, Edition 2”

    <The C programming language> Edition 2的习题答案地址: http://users.powernet.co.uk/eton/kandr2/index.h ...

  8. C Programming Language

    代做module作业.代做C/C++编程设计作业.代写Programming Language作业.代做C/C++课程设计作业 C Programming Language Contribution ...

  9. iOS Swift-元组tuples(The Swift Programming Language)

    iOS Swift-元组tuples(The Swift Programming Language) 什么是元组? 元组(tuples)是把多个值组合成一个复合值,元组内的值可以使任意类型,并不要求是 ...

  10. 《The C programming language》学习笔记

    Brian和Dennis的<c程序设计语言>(The C Programming Language)真不愧为c语言方面的经典书籍,薄薄的一本,却让人爱不释手,每次阅读都能有所收获.好记忆不 ...

最新文章

  1. map评价吗 voc数据集可以用coco_【庖丁解牛】从零实现RetinaNet(九):使用COCO预训练权重在VOC上训练RetinaNet...
  2. iframe 禁止打开新窗口_教育部新政策:禁止中学生复读?
  3. 别让我思考(Don’t make me think)
  4. 前端学习(3276):js中this的使用
  5. 三星java3倍拍照手机_全世界拍照最强的两款手机,一个是三星,一个是它
  6. JavaScript Debug 之 Console
  7. Windows 7镜像坎坷之路 - 都是Daemon Tools惹得祸
  8. WPS2019 所有宏被禁,用启用宏要付费,如何免费使用
  9. 盘点各大厂商的活体检测服务,哪款更适合应用开发者?
  10. 科赫雪花c语言程序设计,用 C 语言画科赫雪花
  11. oppor829t如何刷机_科普OPPO R1 R829T的线刷教程及最简单的三星手机刷机教程
  12. app上架需要哪些资料
  13. 80C51单片机的四组IO口
  14. PDF文件怎么编辑,如何删除其中一页
  15. 论坛社区项目——项目总结
  16. Java算法完美解决五位哲学家用餐问题
  17. Ubuntu基本使用指南
  18. 电影评论情感分析-直播案例
  19. [BPM 架构]顶级免费和开源BPM软件
  20. 利用随机森林对特征重要性进行评估(公式原理)

热门文章

  1. 盘点Win10系统的实用“小设计”
  2. Linux文件默认权限和umask笔记
  3. charles乱码_基于iOS的Charles抓包实践
  4. php事务 面向对象,关于PHP面向对象的事务脚本模式
  5. main spring启动_SpringBoot学习(一):为什么main方法启动类需要放在项目根目录...
  6. java 网站开发实例_完整的javaweb项目
  7. dataframe中将一列数据切分成多列
  8. EasyMock学习笔记
  9. 敏捷制造:并不是你想像的矛盾体
  10. PingingLab传世经典系列《CCNA完全配置宝典》-3.4 Trunk进阶配置