推广 热搜: csgo  vue  2023  angelababy  gps  信用卡  新车  htc  落地  控制 

C语言四大名著?

   2023-08-30 网络整理佚名2310
核心提示:对于C语言的学习与进阶,这四大名著如果不提及实在是不太专业。难道在C语言中结构不能包含指向自己的指针吗?C语言中有和的with等价的语句吗?好了,今天就把C语言书籍推荐这块讲了一下,这里更多的是C语言的一些语法和易错点,当然我们不能老是陷在C语言的语法糖里面无法自拔,欲善其功先利其器,连这些语法糖都没有掌握好又怎么发功发力呢?

关注“嵌入式大杂烩”,选择“明星公众号”,共同进步!

很多朋友问我,我学了C语言很久了,但是看一些稍微大一点的代码还是感觉一头雾水。 自己写一些程序,漏洞百出。 我该如何改进它?

“你有什么好的书籍和资料可以推荐吗?”

“虫菌,你平时都看哪些C语言编程的书?”

“有一本叫XXX的书怎么样?你想买一本来学习吗?”

……

每次遇到这些读者的问题,我都不知道从哪个层面跟他聊这个话题,所以今天就从学习C语言开始吧。

对于C语言的学习和进步,如果不提到“四大经典”,那就是不专业的。 他们都已经很老了。 一方面也说明了C语言的经久不衰,另一方面也证明了它们确实是经典。

重要的是,虫菌平均看了这些书1~2遍,理解很深。 这些都是迄今为止流传已久的书籍之一~

第一本经典书籍是我读书时导师推荐给我的:

目录······

第1C章:穿越时空迷雾

1.1 C语言的史前阶段

1.2 早期使用C语言的经验

1.3 标准I/O库和C预处理器

1.4 K&R C

1.5 当今的 ANSI C

1.6 很棒,但是符合标准吗

1.7 编译限制

1.8 ANSI C 标准的结构

1.9 阅读 ANSI C 标准的乐趣和好处

1.10“悄然改变”到底有多安静?

1.11 放轻松——编译器定义的效果

第 2 章 这不是一个错误,这是一个语言特性

2.1 这与语言特性有什么关系? 这是这里的一个错误

2.2 过度使用

2.3 错误

2.4 减少错误

2.5 别着急——有些功能确实是bug

2.6 参考文献

第 3 章分析 C 语句

3.1 编译器喜爱的纯语法

3.2 语​​句是如何形成的

3.3 优先级规则

3.4 通过图表分析C语言声明

3.5可以成为你的朋友

3.6 int x[10]和#x int[10]的区别

3.7 foo{ ... foo; 的含义 }

3.8 理解所有分析过程的代码片段

3.9 放轻松——软件驱动物理实体

第 4 章令人震惊的事实:数组指针不一样

4.1 数组不是指针

4.2 为什么我的代码不起作用

4.3 什么是声明,什么是定义

4.4 将声明与定义相匹配

4.5 数组和指针的其他区别

4.6 放轻松——回文的乐趣

第 5 章:关于链接的思考

5.1 函数库、链接和加载

5.2 动态链接的优点

5.3 库链接的五个特殊秘密

5.4 警惕

5.5 生成链接器报告文件

5.6 放松 - 看看谁在说话:挑战测验

第 6 章运动中的诗歌:运行时数据结构

6.1 a.out及其图例

第 6.2 段

6.3 操作系统在a.out文件中做了什么

6.4 C语言运行时系统在a.out中做了什么

6.5 函数被调用时会发生什么:流程活动记录

6.6 auto 和关键字

6.7 控制线程

6.8 和

6.9 UNIX 中的堆栈段

6.10 MS-DOS 中的堆栈段

6.11 有用的C语言工具

6.12 放轻松——卡内基梅隆大学的编程困境

6.13 仅供高级学生使用的材料

第 7 章:记忆反思

7.1 英特尔80x86系列

7.2 Intel 80x86 内存模型及其工作原理

7.3 虚拟内存

7.4 高速缓冲存储器

7.5 数据段和堆

7.6 内存泄漏

7.7 总线错误

7.8 放轻松——《东西王》和《页游》

第 8 章 为什么程序员无法区分万圣节和圣诞节

8.1 度量衡系统

8.2 从位模式构建图形

8.3 等待时类型改变

8.4 原型痛苦

8.5 原型失败的地方

8.6 不按回车键获取字符

8.7 用 C 语言实现有限状态机

8.8 软件比硬件更难

8.9 如何以及为何执行类型强制

8.10 放轻松——国际C语言混沌代码大赛

第 9 章重温数组

9.1 数组何时与指针相同

9.2 为什么会出现混乱

9.3 为什么C语言把数组参数当作指针

9.4 数组切片下标

9.5 数组和指针交换性总结

9.6 C 中的多维数组

9.7 放轻松——软件/硬件平衡

第 10 章重温指针

10.1 多维数组的内存布局

10.2 指针数组是向量

10.3 在锯齿状数组上使用指针

10.4 将一维数组传递给函数

10.5 使用指针将多维数组传递给函数

10.6 使用指针从函数返回数组

10.7 使用指针创建和使用动态数组

10.8 放轻松——程序检查的局限性

第11章 你懂C,所以C++没问题

11.1 面向对象编程简介

11.2 抽象——获取事物的本质特征

11.3 封装——将相关类型、数据和函数分组在一起

11.4 显示一些类-用户定义类型与预定义类型具有相同的权限

11.5 访问控制

11.6 声明

11.7 如何调用成员函数

11.8 继承——重用已经定义的操作

11.9 多重继承——从两个或多个基类派生

11.10 重载——不同类型上具有相同名称的相同操作

11.11 C++如何执行运算符重载

11.12 C++中的输入/输出(I/O)

11.13 多态性——运行时绑定

11.14 说明

11.15 C++如何表达多态性

11.16 好奇心——多态性

11.17 C++的其他要点

11.18 如果我的目标在那里,我就不会从这里开始

11.19 可能过于复杂,但这是唯一可能的解决方案

11.20 放轻松——死亡计算机协会

11.21 进一步阅读

附录 A 程序员面试秘诀

附录 B 术语表

▲上下滑动查看原书目录

一听到这个名字就觉得这本书比较高大上。 看完了,就是C语言的“砖房”。 真是太生动了。 本书的目录展示了本书的全貌。 你会发现你对一切都感兴趣。 我当时就买了。 每天啃一本书,越看越觉得自己无知。

读完本书,你将不再停留在C语言的简单语法上,而是会从更深层次的角度去欣赏它。 现在回想起来,这本书你应该读两遍吧~

第二本书

目录······

第一章 快速入门

1.1 简介

1.1.1 空白和注释

1.1.2 预处理指令

1.1.3 主要功能

1.1.4 功能

1.1.5 功能

1.2 补充说明

1.3 编译

1.4 总结

1.5 警告摘要

1.6 编程技巧总结

1.7 问题

1.8 编程练习

第 2 章 基本概念

2.1 环境

2.1.1 翻译

2.1.2 执行

2.2 词汇规则

2.2.1 人物

2.2.2 注意事项

2.2.3 自由格式源代码

2.2.4 标识符

2.2.5 程序格式

2.3 程序风格

2.4 总结

2.5 警告摘要

2.6 编程技巧总结

2.7 问题

2.8 编程练习

第三章数据

第四章 声明

第 5 章 运算符和表达式

第 6 章 指针

第七章 功能

第 8 章数组

第 9 章字符串、字符和字节

第 10 章结构和联合

第11章动态内存分配

第 12 章使用结构体和指针

第 13 章高级指针主题

第 14 章预处理器

第15章输入/输出功能

第十六章 标准函数库

第十七章经典抽象数据类型

第十八章运行时环境

对附录中部分问题的回答

指数

参考

▲上下滑动查看原书目录

这本书的经历确实是跌宕起伏。 第一次知道这本书是在我刚毕业的公司的书架上。 估计已经被部门其他老板看了无数遍了。 我丢了,所以在公司没事干的时候就看了。 确实是一本好书,后来我自己又买了一本新的。

当时我学习得很认真,也做了很多笔记。 不幸的是,我在前年搬家的过程中把它弄丢了。 这比丢了钱包更令人心碎。 我希望他能被同行业的朋友接走。 生活不应该太糟糕。 别去垃圾站~

后来因为这本书的内容比较熟悉,所以就没有买新的。 如果真想看的话,我就拿着电子档看,但还是要花很多眼睛。

第三本书

目录······

第 0 章简介

第一章 词汇“陷阱”

1.1=不同于==

1.2& 和 | 与 && 和 || 不同

1.3 词法分析中的“贪心法”

1.4 整数常量

1.5 字符和字符串

第 2 章 语法“陷阱”

2.1 理解函数声明

2.2 运营商优先级

2.3 注意分号作为语句结束

2. 声明

2.5 函数调用

2.6 “挂”else引起的问题

第 3 章 语义“陷阱”

3.1 指针和数组

3.2 非数组指针

3.3 作为参数的数组声明

3.4 避免“示例方法”

3.5 空指针不是空字符串

3.6 边界计算和非对称边界

3.7 评估顺序

3.8 运算符&&、|| 和 !

3.9 整数溢出

3.10 为函数main提供返回值

第 4 章 连接

4.1 什么是连接器

4.2 声明和定义

4.3 命名冲突和修饰符

4.4 形式参数和真实参与返回值

4.5 检查外部类型

4.6 头文件

第 5 章 库函数

5.1 返回整数的函数

5.2 更新序列文件

5.3 缓冲输出和内存分配

5.4 使用errno检测错误

5.5 库函数

第 6 章 预处理器

6.1 不要忽略宏定义中的空格

6.2 宏不是函数

6.3 宏不是语句

6.4 宏不是类型定义

第 7 章可移植性陷阱

7.1 对C语言标准变更的应对

7.2 标识符名称的限制

7.3 整数的大小

7.4 字符是有符号整数还是无符号整数

7.5 移位运算符

7.6 内存位置0

7.7 除法时的截断

7.8 随机数大小

7.9 大小写转换

7.10 先释放,再重新分配

7.11 可移植性问题的一个例子

第 8 章 建议和解答

8.1 建议

8.2 答案

附录,与

附录和对 Moo 夫妇的采访

▲上下滑动查看原书目录

虫菌和一些朋友称他为《避免陷阱指南》,也被公认为是一本好书。 第一次读完之后,基本上会处于一种不敢写代码的状态,生怕一不小心写出bug。 。

好在这本书比较清淡,不记得看了多少遍了。 自从接触这本书后,我就开始关注并记录平时学习和开发中容易出现问题的编程点。 一定要读一下~

最后的访谈经典

目录......

第一章声明与初始化

基本型

1.1 如何决定使用哪种整数类型?

1.2 为什么不精确定义标准类型的尺寸?

1.3 因为C语言没有精确定义类型的大小,所以我一般用它来定义int16和int32。 然后根据实际机器环境将其定义为int、short、long等类型。 那么看起来所有问题都解决了,不是吗?

1.4 新的64位机器上的64位类型是什么?

指针声明

1.5 这样的说法有什么问题吗? 字符 *p1, p2; 我在使用p2时出现错误。

1.6 我想声明一个指针并为其分配一些空间,但是不起作用。 这样的代码有什么问题吗? 字符*p; *p=(10);

陈述式

1.7 声明和定义全局变量和函数的最佳方式是什么?

1.8 如何在C 中实现不透明(抽象)数据类型?

1.9 如何生成“半全局变量”,即只能被某些源文件中的某些函数访问的变量?

存储类型

1.10 同一 () 函数或变量的所有声明都必须包含存储类型吗?

1.11 函数声明中的含义是什么?

1.12 关键字auto的用途是什么?

类型定义()

1.13 对于用户自定义类型,和#有什么区别?

1.14 我似乎无法成功定义链表。 我尝试过 {char *item; 下一个;}* ; 但编译器报了错误信息。 C 中的结构不能包含指向自身的指针吗?

1.15 如何定义一对相互引用的结构?

1.16 声明 { } x1; 之间有什么区别和 { } x2;?

1.17 “int(*)();”是什么意思意思是?

常量限定符

1.18 我有一组这样的声明: char *charp; const 夏普 p; 为什么 p 不是它指向的字符 const?

1.19 为什么下面的初始化公式和数组维度值中不能使用const值? 常量整数n=5; 整数a[n];

1.20 const char *p、char const *p 和 char *const p 之间有什么区别?

复杂的陈述

1.21 如何构建和理解非常复杂的语句? 例如定义一个包含 N 个指向返回字符指针的函数的指针的数组?

1.22 如何声明一个返回相同类型函数指针的函数? 我正在设计一个状态机,其中每个状态都由一个函数表示,每个函数返回一个指向下一个状态的函数的指针。 但我找不到任何方法来声明这样的函数 - 感觉就像我需要一个返回指针的函数,该函数返回一个指向返回指针的函数的指针,等等,无穷无尽。

数组大小

1.23 我可以声明一个与传入数组大小相同的本地数组,或者一个大小由其他参数指定的参数数组吗?

1.24 我在一个文件中定义了一个数组,然后在另一个文件中使用它,为什么无法获取数组的大小?

陈述问题

1.25 函数只定义一次、调用一次,但编译器提示重新声明非法。

1.26 main 的正确定义是什么? void main 正确吗?

1.27 我的编译器总是报函数原型不匹配的错误,但我认为没有什么问题。 这是为什么?

1.28 文件中的第一个语句引发了一个奇怪的语法错误,但我认为它没有任何问题。 这是为什么?

1.29 为什么我的编译器不允许我定义大数组,例如 array[256][256]?

命名空间

1.30 如何确定哪些标识符可以使用,哪些可以保留?

初始化

1.31 对于未显式初始化的变量的初始值可以做出哪些假设? 如果全局变量的初始值为“零”,它可以充当空指针或浮点零吗?

1.32 为什么下面的代码不能编译? intf() { char a[] = "你好,世界!"; }

1.33 下面的初始化有什么问题? 编译器提示“ ”或其他信息。 字符 *p=(10);

1.34 char a[]= " "; 和有什么区别和 char *p=" "; 初始化? 当我给 p[i] 赋值时,我的程序崩溃了。

1.35 字符a{[3]}=“abc”; 合法吗?

1.36 我终于知道如何声明函数指针了,但是如何初始化它们呢?

1.37 联合体可以初始化吗?

第 2 章结构、联合和枚举

结构声明

2.1 x1{ }; 和 x1{ }; 有什么区别和 { }x2;

2.2 为什么这段代码是错误的? X{ }; X ;

2.3 结构体可以包含指向自身的指针吗?

2.4 用C语言实现抽象数据类型的最佳方式是什么?

2.5 有没有好的方法来模拟 C 语言中的继承等面向对象编程特性?

2.6 为什么语句f(x *p); 给我一条晦涩的警告信息?

2.7 我遇到一个声明这样的结构的代码: name {int ; 字符[1];}; 然后使用一些内存分配技术让数组看起来有多个元素并记录元素的数量。 它是如何工作的? 这合法且可移植吗?

2.8 我听说结构体可以赋值给变量,也可以传入传出函数。 为什么K&R1明确表示不能这样做?

2.9 为什么不能使用内置的 == 和 != 运算符来比较结构?

2.10 结构体传递和返回是如何实现的?

2.11 如何将常量值传递给接受结构体参数的函数? 如何创建未命名的中间常量结构值?

2.12 如何从数据文件读取结构或向数据文件写入结构?

结构填充

2.13 为什么我的编译器在结构中留下漏洞? 这会导致空间浪费,并且无法从外部数据文件读取和写入“二进制”。 可以关闭填充或控制域的对齐吗?

2.14 为什么返回值比结构体大小的预期值大,末尾是否有?

2.15 如何确定结构体中字段的字节偏移量?

2.16 如何在运行时按名称访问结构体中的字段?

2.17 C 语言中是否有与 and with 等价的语句?

2.18 既然数组名可以用作数组的基地址,为什么不能用作结构体的基地址呢?

2.19 程序运行正确,但退出时出现“core dump”(核心转储),这是怎么回事?

联合的

2.20 结构体和联合体有什么区别?

2.21 有没有办法初始化联合体?

2.22 是否有一种自动方法来跟踪正在使用的联合域?

枚举

2.23 枚举与一组经过预处理的#有何不同?

2.24 枚举是否可移植?

2.25 有没有简单的方法来显示枚举值的符号?

位域

2.26 某些结构声明中的这些冒号和数字是什么意思?

2.27 为什么人们更喜欢使用显式掩码和位操作而不是直接声明位域?

第 3 章 表达式

评估顺序

3.1 为什么这段代码不起作用? a[i]= i++;

3.2 使用我的编译器,如下代码 int i= 7; ("%d\n", i++ * i++); 打印出 49。不管按什么顺序计算,不应该是 56 吗?

3.3 对于代码int i=3; 我=我++; 不同的编译器给出不同的i值,有的是3,有的是4,哪一个是正确的?

3.4 有这样一个巧妙的表达:a^=b^=a^=b; 它可以在没有临时变量的情况下交换a和b的值。

3.5 我可以使用显式括号来强制执行我想要的计算顺序并控制相关的副作用吗? 即使括号不起作用,运算符优先级可以控制计算顺序吗?

3.6 但是 && 和 || 又如何呢? 运算符?我见过类似 while((c = ()) != EOF && c != \n) 的代码

3.7 是否可以安全地假设一旦 && 和 || 左侧的表达式已经确定了整个表达式的结果,右边的表达式将不会被计算?

3.8 为什么表达式("%d %d", f1(), f2()); 先调用f2? 我觉得逗号表达式应该确保从左到右的评估顺序。

3.9 如何理解复杂的表达式并避免编写未定义的表达式? 什么是“序列点”?

3.10 在a[i] = i++;中,如果不关心a[]的哪个部分会被写入,这段代码没有问题,i确实会加1,对吗?

3.11 人们总是说 i=i++ 的行为是未定义的。 但我刚刚在ANSI编译器上尝试了一下,结果正如我所料。

3.12 我不想学习那些复杂的规则,如何避免这些未定义的评估顺序问题?

其他表达问题

3.13 ++i 和 i++ 有什么区别?

3.14 如果我不使用表达式的值,我应该使用 i++ 还是 ++i 进行自增?

3.15 我想检查一个数字是否在另外两个数字之间,为什么不使用 if (abc) 呢?

3.16 为什么下面的代码是错误的? 整数a=1000, b=1000; 长整型 c=a * b;

3.17 为什么下面的代码总是给出0? 摄氏度,华氏度; 摄氏度 = 5.0 / 9 * (华氏度 - 32);

3.18 需要根据条件将复杂表达式分配给两个变量之一。 是否可以使用如下代码? (()?a:b) = 开;

3.19 我的一些代码包含这样的表达式。 A? b=c :d 有些编译器接受它,有些则不接受。 为什么?

保护规则

3.20 ANSI C 中的警告“of”是什么意思?

3.21 “无符号守卫”和“值守卫”规则有什么区别?

第 4 章 指针

第 5 章 空指针

第 6 章数组和指针

第 7 章 内存分配

第 8 章 字符和字符串

第 9 章布尔表达式和变量

第 10 章 C 预处理器

第 11 章 ANSI/ISO 标准 C

第12章标准输入和输出库

第13章库函数

第14章浮点运算

第 15 章变量参数列表

第16章奇怪的问题

第17章 风格

第十八章工具和资源

第19章系统依赖

第20章杂项

词汇表

参考

▲上下滑动查看原书目录

仔细看完这么详细的目录,大概能自信回答的问题并不多。 确实,公司HR需要研发部门出一套软件笔试题,基础的C语言题会从这本书中摘录出来。

不过,本书不建议大家集中精力仔细阅读,而是花一些时间去逐一突破。 相信你一定会收获很多,也会更加有阅读的欲望~

我手头只有这几本C语言的书,对于以后的开发完全足够了。 市面上的教材虽然很多,但熟悉度都很高,甚至很多都是东拼西凑的。 知识连贯性不足

当然,我不建议你马上购买这4本书。 如果你是一个技术人员,你应该更加理性一些。 毕竟我认为好的不一定适合你。

你可以找一些电子文档,先阅读相应的章节,看看你是否真的感兴趣,以及作者的风格是否真的符合你的口味。 不然不管你买不买,它都会留在家里吃灰,占空间。 有些朋友甚至每天都会面临很多没有时间读的书。 他们会感到深深的负罪感,最终失去学习的动力。

“书不多、新、厚,但若有神,便明了”~

终于

好了,今天就来说说C语言书籍的推荐。 这里详细介绍一下C语言的一些语法和易错点。 当然,我们不能总是陷在C语言的语法糖里,想要擅长它。 技能先磨砺,不掌握这些语法糖,我们如何运用技能呢?

你也许也喜欢:

过去的推荐

 
反对 0举报 0 收藏 0 打赏 0评论 0
 
更多>同类资讯
推荐图文
推荐资讯
点击排行
网站首页  |  关于我们  |  联系方式  |  使用协议  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报
Powered By DESTOON