《C语言编程魔法书:基于C11标准》—— 导读

简介:


92ad09bd8e184c146fc4b40b111afa3efbf067b6


8cc0f67e4227e42e62bf23365c5d79bc67421090

前  言
为什么要写这本书
本人在2001年上了大学本科,读计算机科学与技术专业。在第一年的上半学期,对计算机编程还没什么感觉。但是就在考“C语言程序设计”这门专业课的前一个月,感觉这门课学了那么久几乎什么都不会,可把我急坏了。然后就在这短短一个月的时间里又是看书,又是上机实验,终于考了70多分,算是过关了……不过奇怪的是在考试结束后,就发现自己对编程有了感情。到了大二,我们上“数据结构”所使用的教材是基于C++编程语言的,因为之前没学过C++语言,所以只能自学。而在这个过程中,我发现自己对编程更加热爱。在上完大三之后,我在暑假里又把之前的C语言重新巩固一番。有了计算机组成、操作系统、汇编语言、数据结构等知识积淀之后再去看C语言编程就感觉容易多了。我也是由此喜欢上了C编程语言。
10年之后,发现国内市面上很多C语言参考书仍然显得非常陈旧。不仅基于古老的C89/90标准,而且还在用Visual C++ 6.0这种既收费又老旧的开发环境教学生。对于比较新的C99标准的讲解屈指可数,更鲜有针对最新的C11标准的书籍。出于对C语言的热爱,在此热切希望能把最新标准的C语言奉献给各位读者,也想把C语言的方方面面讲透并且能讲得通俗易懂,方便读者去思考实践,所以这也是我写这本书的主要原因。当各位阅读完本书之后,会发现C语言竟然如此强大!而且在大部分时候,尤其是我们想集中注意力解决某个特定问题的时候,使用C语言要比用其他一些基于面向对象的类C编程语言(比如C++、Java等)要直观得多!
本书之所以叫“C语言编程魔法书”,是因为像“宝典”、“圣经”之类的词已经被用滥了。再者,C语言本身就拥有极其强大的魔力,你能用它做几乎所有的事情。而且几乎每一个C语言编译器都能内联汇编语言,或者与C++、Objective-C直接兼容,而对于像Java、C#、Python等许多编程语言也有相应的接口。所以,我认为C语言在计算机编程语言领域中就好比数学在自然科学中的地位和作用,它是很多编程语言的基础,而且很多编程语言的编译器或解释器也都是基于C语言来写的。
就在2015年2月,Khronos标准组织发布了最具现代化的图形API——Vulkan,其主机端接口用的API是纯C语言。此外,像OpenGL、OpenCL、OpenAL、OpenVG等开放标准都基于纯C语言。此外,最近10年来TIOBE每月的编程语言排名,C语言排名始终能进前两名,也能说明它的使用范围之广,而且许多开源项目也多多少少会使用C语言来编写。况且学了C语言之后,再学习C++、Java等面向对象编程语言也会轻松很多。尤其像C++和Objective-C,没有C语言基础是完全不行的。所以个人十分推荐计算机系的大学生将C语言作为自己的计算机入门编程语言!
本书特色
从技术层面上讲,本书介绍了C语言的最新标准,即ISO/IEC 9899:2011。同时,也介绍了主流开源C语言编译器GCC与Clang对标准C语言语法的扩充。而且所基于的编译器和开发环境也是比较新的Visual Studio Community 2017、GCC 5,以及Clang 3.8(Apple LLVM 8.0,基于Xcode 8)。
从适合读者阅读和掌握知识的结构安排上讲,本书分为“预备知识篇”、“基础语法篇”、“高级语法篇”,以及“语法扩展篇”,还有最后的“项目实践篇”。从基础到高级,循序渐进地为读者描述C语言编程方法。本书尤其着重C语言标准语法上的精确描述,通过许多代码片段给读者介绍各种C语言语法知识,并且能反映出C语言的灵活性以及在使用上的约束。
本书推崇读者使用合法免费的C语言编译器以及集成开发环境,希望读者能有正确的软件版权意识,这样才能更好地为我国软件事业增添光彩,为打造良好的应用市场以及生态环境作出贡献。因此,本书主要选择使用GCC、Clang这两个主流开源免费的C语言编译器,而集成开发环境(IDE)则采用Visual Studio Community、Eclipse、Xcode这三个常用的免费开发工具,其中,Visual Studio Community不是开源的,而Xcode则是部分开源的。
本书虽然会讲解整个C编程语言,涉及了几乎所有的语法点,但是考虑到本书读者可能是初学C语言,且没有多少计算机专业知识,所以本书措辞会尽量通俗,而不过于追求学术化。某些描述可能会不太严谨,但对于本书所用到的GCC、Clang这两大主流编译器而言将完全适用。另外,考虑到不少读者从事嵌入式系统开发工作,所以对于C语言标准中出现的所谓“由实现定义的”场合会尽量区分情况分别阐明。本书的最终的目的就是让读者至少能熟练掌握C语言编程,能将它灵活地运用于实际工程中。
目  录
前言
第一篇 预备知识篇
[第1章 C魔法概览
1.1 例说编程语言 ](https://yq.aliyun.com/articles/109369)
1.2 用C语言编程的基本注意事项
1.3 主流C语言编译器介绍
1.4 关于GNU规范的语法扩展
1.5 用C语言构建一个可执行程序的流程
1.6 本章小结
[第2章 学习C语言的预备知识
2.1 计算机体系结构简介
2.1.1 贮存器
2.1.2 存储器
2.1.3 寄存器
2.1.4 计算单元
2.1.5 程序执行流程 ](https://yq.aliyun.com/articles/109385)
[2.2 整数在计算机中的表示
2.2.1 原码表示法
2.2.2 补码表示法
2.2.3 八进制数与十六进制数 ](https://yq.aliyun.com/articles/109390)
2.3 浮点数在计算机中的表示
2.4 地址与字节对齐
2.5 字符编码
2.6 大端与小端
2.7 按位逻辑运算
[2.8 移位操作
2.8.1 算术左移与逻辑左移
2.8.2 逻辑右移
2.8.3 算术右移
2.8.4 循环右移 ](https://yq.aliyun.com/articles/109399)
2.9 本章小结
[第3章 C语言编程的环境搭建
3.1 Windows操作系统下搭建C语言编程环境
3.1.1 安装Visual Studio Community 2017
3.1.2 安装MinGW编译器
3.1.3 安装LLVM Clang编译器 ](https://yq.aliyun.com/articles/109443)
3.2 macOS系统下搭建C语言编程环境
3.3 本章小结
第二篇 基础语法篇
第4章 C语言中的基本元素
4.1 C语言中的字符集
4.2 C语言中的token
4.2.1 C语言中的标识符
4.2.2 C语言中的关键字
4.2.3 C语言中的常量与字符串字面量
4.2.4 C语言中的标点符号
4.3 关于C语言中的“对象”
4.4 C语言中的“副作用”
4.5 C语言标准库中的printf函数
4.6 本章小结
第5章 基本数据类型
5.1 整数类型
5.1.1 int类型
5.1.2 short类型
5.1.3 long类型
5.1.4 long long类型
5.1.5 布尔类型
5.1.6 字符类型
5.1.7 宽字符以及Unicode字符类型
5.1.8 size_t与ptrdiff_t类型
5.1.9 C语言中的标准整数类型
5.2 浮点类型
5.3 数据精度与类型转换
5.3.1 整数晋升
5.3.2 带符号与无符号整数之间的转换
5.3.3 浮点数与浮点数的转换以及浮点数与整数之间的转换
5.4 C语言基本运算操作符
5.4.1 加、减、乘、除与求模运算操作符
5.4.2 按位逻辑操作符
5.4.3 自增、自减操作符
5.4.4 关系操作符、相等性操作符与逻辑操作符
5.4.5 移位操作符
5.4.6 圆括号操作符
5.5 sizeof操作符
5.6 投射操作符
5.7 本章小结
第6章 用户自定义类型
6.1 枚举类型
6.2 结构体类型
6.2.1 结构体概述
6.2.2 用结构体创建对象并访问其成员
6.2.3 结构体复合字面量
6.3 联合体类型
6.4 位域
6.4.1 位域的一般特性
6.4.2 位域成员的存放与布局
6.4.3 匿名位域
6.4.4 位域使用示例
6.5 字节对齐与字节填充
6.5.1 _Alignof操作符
6.5.2 _Alignas对齐说明符
6.5.3 结构体成员的字节对齐与字节填充
6.6 复数类型
6.7 本章小结
第7章 C语言的数组与指针
7.1 一维数组
7.2 多维数组
7.3 变长数组
7.4 一级指针与对象地址
7.4.1 地址与指针的基本概念
7.4.2 访问指针对象所指对象的内容
7.4.3 指针对象的其他操作
7.5 多级指针
7.6 指向用户自定义类型的指针
7.7 指针与数组的关系
7.8 指向数组的指针
7.9 void类型、指向void类型的指针与空指针
7.10 字符数组与字符串字面量
7.11 完整与不完整类型
7.12 灵活的数组成员
7.13 本章小结
第8章 C语言的控制流语句
8.1 逗号表达式
8.2 条件表达式
8.3 if-else语句
8.4 switch-case语句
8.5 while与do-while迭代语句
8.6 for迭代语句
8.7 goto语句
8.8 本章小结
第9章 C语言的函数
9.1 函数的声明与定义
9.2 函数调用与实现
9.2.1 函数调用的顺序点
9.2.2 函数的栈空间
9.2.3 函数的参数传递与返回
9.2.4 通过形参修改实参的值
9.3 数组类型作为函数形参
9.4 带有不定参数类型及个数的函数声明与调用
9.5 函数的递归调用
9.6 内联函数
9.7 函数的返回类型与无返回函数
9.8 指向函数的指针
9.9 C语言中的主函数main
9.10 函数与函数调用作为sizeof操作符
9.11 本章小结
第10章 C语言预处理器
10.1 宏定义
10.1.1 宏的基本使用
10.1.2 宏定义中的#操作符
10.1.3 宏定义中的##操作符
10.1.4 宏替换
10.1.5 可变参数的宏定义
10.2 C语言中预定义的宏
10.2.1 C语言强制要求的预定义宏
10.2.2 环境宏
10.2.3 条件特征宏
10.2.4 主流编译器及平台预定义的宏
10.3 条件预编译
10.4 源文件包含预处理指示符
10.5 #error 预处理指示符
10.6 #line 预处理指示符
10.7 #undef 预处理指示符
10.8 pragma预编译指示符与操作符
10.9 空指示符与C语言中的程序注释
10.10 本章小结
第11章 C语言程序的编译上下文
11.1 C语言程序中的作用域和名字空间
11.1.1 文件作用域
11.1.2 函数作用域
11.1.3 函数原型作用域
11.1.4 语句块作用域
11.1.5 标识符的重定义与作用域的叠交
11.1.6 标识符的名字空间
11.2 全局对象与函数
11.3 静态对象与函数
11.4 局部对象
11.5 对象的存储与生命周期
11.6 _Thread_local对象
11.7 本章小结
第三篇 高级语法篇
第12章 C语言中的类型限定符
12.1 const限定符
12.1.1 const限定符修饰普通对象
12.1.2 const限定符修饰数组元素
12.1.3 const限定符修饰指针类型对象
12.1.4 const限定符修饰函数形参类型为数组的对象
12.1.5 类型限定符的本质含义
12.2 volatile限定符
12.3 restrict限定符
12.4 _Atomic限定符
12.5 本章小结
第13章 C语言的类型系统
13.1 对象类型与函数类型
13.2 对声明符的进一步说明
13.3 更复杂的声明
13.3.1 将某一类型转换为指向该类型的指针
13.3.2 判定当前类型属于哪种对象类型
13.3.3 复杂复合类型的判断
13.4 typedef类型定义
13.4.1 typedef的一般使用
13.4.2 typedef与类型限定符相结合的使用
13.4.3 用typedef来定义结构体与联合体的类型
13.5 本章小结
第14章 C11标准中的表达式、左值与求值顺序
14.1 常量表达式
14.2 泛型选择表达式
14.3 静态断言
14.4 C语言中的左值
14.5 C语言中表达式的求值顺序
14.6 C语言中的语句
14.7 本章小结
第15章 函数调用约定与ABI
15.1 Windows操作系统环境下x86处理器的函数调用约定
15.1.1 Windows操作系统下32位x86执行模式的函数调用约定
15.1.2 Windows操作系统下64位x86执行模式的函数调用约定
15.2 Unix/Linux操作系统环境下x86处理器的函数调用约定
15.3 ARM处理器环境下的函数调用约定
15.3.1 AArch32架构环境下的函数调用约定
15.3.2 AArch64架构环境下的函数调用约定
15.4 本章小结
第16章 创建静态库与动态库
16.1 Windows系统下创建静态库与动态库
16.1.1 Windows系统下创建并使用静态库
16.1.2 Windows系统上创建并使用动态库
16.2 macOS系统下创建静态库与动态库
16.2.1 macOS系统下创建并使用静态库
16.2.2 macOS系统下创建并使用动态库
16.3 Linux系统下创建并使用静态库与动态库
16.3.1 Linux系统下创建并使用静态库文件
16.3.2 Linux系统下创建并使用动态库
16.4 本章小结
第四篇 语法扩展篇
第17章 GCC对C11标准的语法扩展
17.1 在表达式中使用复合语句与声明
17.2 声明语句块作用域的跳转标签
17.3 跳转标签作为值
17.4 嵌套函数
17.5 使用typeof来获取对象类型
17.6 使用__auto_type做类型自动推导
17.7 对复数操作的扩展
17.8 半精度浮点类型
17.9 长度为零的数组
17.10 对可变参数个数的宏的语法扩展
17.11 case语句中使用范围表达式
17.12 投射到一个联合体类型
17.13 使用二进制整数字面量
17.14 使用__attribute__指定函数、对象与类型的属性
17.14.1 __attribute__用于修饰函数的属性
17.14.2 __attribute__用于修饰对象的属性
17.14.3 __attribute__用于修饰类型的属性
17.15 本章小结
第18章 Clang编译器对C11标准的扩展
18.1 特征检查宏
18.2 _Nullable与_Nonnull
18.3 函数重载
18.4 Blocks语法
18.5 本章小结
第19章 对C语言的未来展望
19.1 C语言中的属性
19.2 fallthrough属性
19.3 数组片段
19.3.1 数组片段的赋值操作
19.3.2 数组片段的算术计算操作
19.3.3 数组片段用于函数调用的情况
19.4 其他语法特性
19.5 本章小结
第五篇 项目实践篇
第20章 制作UTF-8与UTF-16编码字符串的转码器
20.1 UTF-8字符编码格式
20.2 UTF-16字符编码格式
20.3 代码示例
20.4 本章小结
第21章 制作控制台计算器
21.1 对数字的解析
21.2 对操作符的优先级处理
21.3 代码示例
21.4 本章小结

相关文章
|
安全 算法 Java
《C语言程序设计进阶教程》一导读
本文讲的是C语言程序设计进阶教程一导读,市面上有成百上千种关于编程的书籍,其中有很多都是关于C语言编程的,那么为什么我还要写这本书呢?为什么建议你花时间读它呢?这本书跟其他书有什么不同呢?跟很多作者一样,我写这本书是因为我觉得有必要,觉得这本书中的方法比其他书中的更好。
2726 0
|
IDE 开发工具 C语言
《PIC微控制器项目设计:C语言》一导读
本文讲的是PIC微控制器项目设计:C语言一导读,微控制器是一个单芯片微处理器系统,其中包含数据和程序存储器、串行和并行输入/输出、定时器、外部和内部中断,所有这些都集成在一个芯片中,其价格可以低至2.00美元。
2130 0
|
算法 C语言
《C语言课程设计》一导读
本书对C程序设计语言的编程环境、调试程序的基本方法、编码风格等方面进行了介绍。参考程序均按照编码风格并使用标准C语言撰写,以增强程序的可读性,方便读者自行调试和运行。
1017 0
|
测试技术 C语言 C++
《测试驱动的嵌入式C语言开发》——导读
本节书摘来自华章社区《测试驱动的嵌入式C语言开发》一书中的目录,作者:(美)James W. Grenning,更多章节内容可以访问云栖社区“华章社区”公众号查看
1456 0
|
C语言
《C语言程序设计》一导读
本书以解决实际问题的程序设计思想作为出发点,选择C语言作为编程语言,突出结构化程序设计方法,介绍常用的数组、链表等数据结构,以及递归、递推、排序、查找等算法的设计。
1350 0
|
C语言
《C语言程序设计:问题与求解方法》——导读
本节书摘来自华章社区《C语言程序设计:问题与求解方法》一书中的目录,作者:何 勤,更多章节内容可以访问云栖社区“华章社区”公众号查看
1023 0
|
算法 程序员 API
《C语言接口与实现:创建可重用软件的技术》一导读
C语言接口与实现:创建可重用软件的技术 如今的程序员忙于应付大量关于API(Application Programming Interface)的信息。但是,大多数程序员都会在其所写的几乎每一个应用程序中使用API并实现API的库,只有少数程序员会创建或发布新的能广泛应用的API。
2606 0