[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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/290313.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

115怎么利用sha1下载东西_618“甩”度娘,拥抱115,体验和价格才是王道

网盘价钱​前天618&#xff0c;圈子里的朋友几乎都“甩”了度娘一巴掌&#xff0c;我才知道115搞活动&#xff0c;由原来500元1年的钻石会员&#xff0c;变成500元3年&#xff0c;算起来每天不到0.5元&#xff0c;确实比度娘实惠了很多&#xff0c;而且活动持续到6月底。自从发…

安装宝塔面板

安装宝塔面板&#xff1a; 1. 宝塔面板网站&#xff1a; https://www.bt.cn/ 2.安装教程 https://www.bt.cn/bbs/thread-1186-1-1.html 3.1 使用远程工具连接执行以下命令 yum install -y wget && wget -O install.sh http://download.bt.cn/install/install.sh &&…

【COMA】一种将团队回报拆分为独立回报的多智能体算法

文章目录1. COMA 解决了什么问题&#xff08;Motivation&#xff09;2. COMA 怎么解决独立回报分配问题&#xff08;Method&#xff09;2.1 核心思想 counterfactual baseline 的提出2.2 算法大框架 —— 基于 AC 框架的 CTDE&#xff08;Centralized Training Distributed Exe…

C#解析Markdown文档,实现替换图片链接操作

前言又是好久没写博客了其实也不是没写&#xff0c;是最近在「做一个博客」&#xff0c;从2月21日开始&#xff0c;大概一个多星期的时间&#xff0c;疯狂刷进度&#xff0c;边写代码边写了一整系列的博客开发笔记&#xff0c;目前为止已经写了16篇了&#xff0c;然后上3月之后…

LoadRunner测试下载功能点脚本(方法一)

性能需求&#xff1a;对系统某页面中&#xff0c;点击下载功能做并发测试&#xff0c;以获取在并发下载文件的情况下系统的性能指标。 备注&#xff1a;页面上点击下载时的文件可以是word、excel、pdf等。 问题1&#xff1a;录制完下载的场景后&#xff0c;发现脚本里面并没有包…

海南橡胶机器人成本_「图说」海垦看点:海南橡胶联合北京理工华汇智能科技首创我国林间智能割胶机器人...

1 海垦南繁产业集团长期以来高度重视改善职工居住条件&#xff0c;于去年启动了海燕队保障性住房项目&#xff0c;项目建成后将有效解决职工住房问题。图为近日正在加紧施工的建设工地。 蒙胜国 摄2 海南橡胶联合北京理工华汇智能科技有限公司&#xff0c;研发出来的最新一代林…

数据挖掘在轨迹信息上的应用实验

文章目录1. 实验概览2. 数据集下载3. 数据预处理3.1 异常点去除3.2 停留点检测与环绕点检测3.3 轨迹分段4. 基于轨迹信息的数据挖掘4.1 路口检测4.1.1 地图分割与轨迹点速度计算4.2 偏好学习通常&#xff0c;我们将一个连续的GPS信号点序列称为一个轨迹&#xff08;Trajectory&…

Avalonia跨平台入门第二十三篇之滚动字幕

在前面分享的几篇中咱已经玩耍了Popup、ListBox多选、Grid动态分、RadioButton模板、控件的拖放效果、控件的置顶和置底、控件的锁定、自定义Window样式、动画效果、Expander控件、ListBox折叠列表、聊天窗口、ListBox图片消息、窗口抖动、语音发送、语音播放、语音播放问题、玩…

oracle dba 手动创建数据实例

2019独角兽企业重金招聘Python工程师标准>>> 1.手动建库大致步骤 设置环境变量.bash_profile创建目录结构创建参数文件(位置:$ORACLE_HOME/dbs)生成密码文件执行建库脚本创建数据字典其他设置2.DBCA 脚本创建 2.1设置系统环境变量 ORACLE_HOME/app/oracle/11g/11.2.…

asp 强制转换浮点数值_C/C++中浮点数的编码存储

浮点数也称做实型数据(实数)&#xff0c;形式上就是数学中的小数。浮点型数据有两种表达方式&#xff1a; 一种是用数字和小数点表示的&#xff0c;如123.456&#xff1b; 另一种是用指数方式表示&#xff0c;如1.2e-6 或1.2E-6(1.2*10-6)。在计算机中实数是如何存储的呢&#…

PaddleNLP实战——信息抽取(InfoExtraction)

[ 文章目录 ]1. 信息抽取任务是什么&#xff1f;2. 基于PaddleNLP的信息抽取任务2.1 训练任务概览2.2 Predicate列表2.3 SPO列表2.4 代码解析1. 信息抽取任务是什么&#xff1f; 在NLP任务中&#xff0c;通常当我们拿到一段文本时&#xff0c;我们希望机器去理解这段文本描述的…

ThinkPad X220i 刷白名单BIOS,改装第三方无线网卡

ThinkPad X220i自带的网卡是REALTEK RTL8188CE&#xff0c;这张卡在Mac下目前是无解的.国外网站有该卡liunx、unix内核的驱动&#xff0c;但还是没有高人编译出来. 不等了,这卡没戏.正好手边有一台Dell E6400,E6400的无线网卡是DELL Wireless 1397 WLAN Mini-Card,具体型号是&a…

C# 离线人脸识别 ArcSoft

人脸识别&比对发展到今天&#xff0c;已经是一个非常成熟的技术了&#xff0c;而且应用在生活的方方面面&#xff0c;比如手机、车站、天网等。虹软人脸识别服务是免费的。最重要的是它还支持离线识别&#xff0c;并且提供Android、iOS、C、C#版SDK&#xff0c;现在已经升级…

【mongoDB运维篇③】replication set复制集

介绍 replicattion set 多台服务器维护相同的数据副本,提高服务器的可用性,总结下来有以下好处: 数据备份与恢复读写分离MongoDB 复制集的结构以及基本概念 正如上图所示&#xff0c;MongoDB 复制集的架构中&#xff0c;主要分为两部分&#xff1a;主节点&#xff08;Primary&a…

c++ long 转 short_C精品编程之——C语言的数据类型、运算符、表达式,精品课程...

在前边的文章分享中&#xff0c;我们已经看到程序中使用的各种变量都应预先加以说明&#xff0c;即先说明&#xff0c;后使用。对变量的说明可以包括三个方面&#xff1a;数据类型存储类型作用域在本课中&#xff0c;我们只介绍数据类型说明。其它说明在以后各章中陆续介绍。所…

李宏毅Reinforcement Learning强化学习入门笔记

文章目录Concepts in Reinforcement LearningDifficulties in RLA3C Method Brief IntroductionPolicy-based Approach - Learn an Actor (Policy Gradient Method)1. Decide Function of Actor Model (NN? ...)2. Decide Goodness of this Function3. Choose the best functi…

《BI项目笔记》数据源视图设置

原文:《BI项目笔记》数据源视图设置目的数据源视图是物理源数据库和分析维度与多维数据集之间的逻辑数据模型。在创建数据源视图时&#xff0c;需要在源数据库中指定包含创建维度和多维数据集所需要的数据表格和视图。BIDS与数据库连接&#xff0c;读取表格和视图定义&#xff…

201521123070 《JAVA程序设计》第13周学习总结

1. 本章学习总结 以你喜欢的方式&#xff08;思维导图、OneNote或其他&#xff09;归纳总结多网络相关内容。 2. 书面作业 Q1. 网络基础 1.1 比较ping www.baidu.com与ping cec.jmu.edu.cn&#xff0c;分析返回结果有何不同&#xff1f;为什么会有这样的不同&#xff1f; 1.2 t…

.NET 7 预览版2 的亮点之 NativeAOT 回顾

.NET 中备受追捧和期待已久的功能NativeAOT终于出现在本周的.NET 7 预览版2中&#xff0c;该项目的工作仍在继续&#xff0c;该版本将 NativeAOT 从实验性的 dotnet/runtimelab repo 中移出合并进入稳定的运行时库 dotnet/runtime repo&#xff0c;但尚未在 dotnet SDK 中添加足…

c语言十佳运动员有奖评选系统_2019年沃德十佳内饰解读

​2019年沃德十佳内饰解读​mp.weixin.qq.com在这个世界上&#xff0c;要判定一件事物的成功与否并不容易&#xff0c;仅靠主观判断远远不够&#xff0c;而是需要能够进行量化判断的标准和成果。正如运动员需要金牌和冠军积淀&#xff0c;导演和演员需要奖项傍身一样&#xff0…