热搜关键词: matlab人工智能算法嵌入式雷达电机驱动

pdf

C语言程序设计:现代方法(第2版修订版)

  • 1星
  • 2023-10-05
  • 10.96MB
  • 需要1积分
  • 55次下载
标签: C语言

C语言

时至今日,C语言仍然是计算机领域的通用语言之一,但今天的C语言已经和初的时候大不相同了。本书主要目的就是通过一种“现代方法”来介绍C语言,书中强调标准C,强调软件工程,不再强调“手工优化”。第2版修订版中不仅有C99中的新特性,还与时俱进地增加了C11和C18中的内容。本书分为C语言的基础特性、C语言的高级特性、C语言标准库和参考资料4个部分。每章末尾的“问与答”部分给出一系列与该章内容相关的问题及答案,此外还包含适量的习题。

本书是C开发人员的理想参考书,在国外也被众多大学作为C语言课程的教材。

第  1章  C语言概述  1

1.1  C语言的历史  1

1.1.1  起源  1

1.1.2  标准化  1

1.1.3  基于C的语言  2

1.2  C语言的优缺点  3

1.2.1  C语言的优点  3

1.2.2  C语言的缺点  4

1.2.3  高效地使用C语言  5

问与答  5

第  2章  C语言基本概念  7

2.1  编写一个简单的C程序  7

2.1.1  编译和链接  8

2.1.2  集成开发环境  9

2.2  简单程序的一般形式  9

2.2.1  指令  9

2.2.2  函数  9

2.2.3  语句  10

2.2.4  显示字符串  11

2.3  注释  11

2.4  变量和赋值  13

2.4.1  类型  13

2.4.2  声明  13

2.4.3  赋值  14

2.4.4  显示变量的值  15

2.4.5  初始化  16

2.4.6  显示表达式的值  17

2.5  读入输入  17

2.6  定义常量的名字  18

2.7  标识符  19

2.8  C  程序的书写规范  21

问与答  23

练习题  25

编程题  26

第3章  格式化输入  输出  28

3.1  printf函数  28

3.1.1  转换说明  29

3.1.2  转义序列  31

3.2  scanf函数  31

3.2.1  scanf函数的工作方法  32

3.2.2  格式串中的普通字符  34

3.2.3  易混淆的printf函数和scanf函数  34

问与答  35

练习题  37

编程题  38

第4章  表达式  40

4.1  算术运算符  40

4.2  赋值运算符  44

4.2.1  简单赋值  44

4.2.2  左值  45

4.2.3  复合赋值  45

4.3  自增运算符和自减运算符  46

4.4  表达式求值  47

4.5  表达式语句  50

问与答  50

练习题  52

编程题  54

第5章  选择语句  56

5.1  逻辑表达式  56

5.1.1  关系运算符  56

5.1.2  判等运算符  57

5.1.3  逻辑运算符  57

5.2  if语句  58

5.2.1  复合语句  59

5.2.2  else子句  59

5.2.3  级联式if语句  61

5.2.4  “悬空else”的问题  63

5.2.5  条件表达式  63

5.2.6  C89中的布尔值  64

5.2.7  C99中的布尔值  65

5.3  switch语句  66

问与答  69

练习题  72

编程题  74

第6章  循环  77

6.1  while语句  77

6.2  do语句  80

6.3  for语句  82

6.3.1  for语句的惯用法  83

6.3.2  在for语句中省略表达式  83

6.3.3  C99中的for语句  84

6.3.4  逗号运算符  84

6.4  退出循环  86

6.4.1  break语句  87

6.4.2  continue语句  87

6.4.3  goto语句  88

6.5  空语句  90

问与答  92

练习题  94

编程题  95

第7章  基本类型  97

7.1  整数类型  97

7.1.1  C99中的整数类型  99

7.1.2  整型常量  99

7.1.3  C99中的整型常量  100

7.1.4  整数溢出  100

7.1.5  读  写整数  101

7.2  浮点类型  102

7.2.1  浮点常量  103

7.2.2  读  写浮点数  103

7.3  字符类型  104

7.3.1  字符操作  104

7.3.2  有符号字符和无符号字符  105

7.3.3  算术类型  105

7.3.4  转义序列  106

7.3.5  字符处理函数  107

7.3.6  用scanf和printf读  写字符  108

7.3.7  用getchar和putchar读  写字符  108

7.4  类型转换  110

7.4.1  常规算术转换  111

7.4.2  赋值过程中的转换  112

7.4.3  C99中的隐式转换  113

7.4.4  强制类型转换  114

7.5  类型定义  115

7.5.1  类型定义的优点  115

7.5.2  类型定义和可移植性  116

7.6  sizeof运算符  117

问与答  117

练习题  120

编程题  121

第8章  数组  124

8.1  一维数组  124

8.1.1  数组下标  124

8.1.2  数组初始化  126

8.1.3  指示器  127

8.1.4  对数组使用sizeof运算符  129

8.2  多维数组  130

8.2.1  多维数组初始化  131

8.2.2  常量数组  132

8.3  C99  中的变长数组  134

问与答  135

练习题  136

编程题  138

第9章  函数  141

9.1  函数的定义和调用  141

9.1.1  函数定义  144

9.1.2  函数调用  145

9.2  函数声明  147

9.3  实际参数  149

9.3.1  实际参数的转换  150

9.3.2  数组型实际参数  151

9.3.3  变长数组形式参数  153

9.3.4  在数组参数声明中使用static  154

9.3.5  复合字面量  155

9.4  return语句  155

9.5  程序终止  156

9.6  递归  157

9.7  泛型选择  161

问与答  163

练习题  166

编程题  169

第  10章  程序结构  171

10.1  局部变量  171

10.1.1  静态局部变量  172

10.1.2  形式参数  172

10.2  外部变量  172

10.2.1  示例:用外部变量实现栈  172

10.2.2  外部变量的利与弊  173

10.3  程序块  177

10.4  作用域  178

10.5  构建C程序  179

问与答  185

练习题  185

编程题  186

第  11章  指针  188

11.1  指针变量  188

11.2  取地址运算符和间接寻址运算符  189

11.2.1  取地址运算符  189

11.2.2  间接寻址运算符  190

11.3  指针赋值  191

11.4  指针作为参数  192

11.5  指针作为返回值  195

问与答  196

练习题  198

编程题  199

第  12章  指针和数组  201

12.1  指针的算术运算  201

12.1.1  指针加上整数  202

12.1.2  指针减去整数  202

12.1.3  两个指针相减  203

12.1.4  指针比较  203

12.1.5  指向复合字面量的指针  203

12.2  指针用于数组处理  204

12.3  用数组名作为指针  206

12.3.1  数组型实际参数(改进版)  207

12.3.2  用指针作为数组名  208

12.4  指针和多维数组  209

12.4.1  处理多维数组的元素  209

12.4.2  处理多维数组的行  210

12.4.3  处理多维数组的列  210

12.4.4  用多维数组名作为指针  210

12.5  C99中的指针和变长数组  211

问与答  212

练习题  213

编程题  215

第  13章  字符串  217

13.1  字面串  217

13.1.1  字面串中的转义序列  217

13.1.2  延续字面串  218

13.1.3  如何存储字面串  218

13.1.4  字面串的操作  219

13.1.5  字面串与字符常量  219

13.2  字符串变量  220

13.2.1  初始化字符串变量  220

13.2.2  字符数组与字符指针  221

13.3  字符串的读和写  222

13.3.1  用printf函数和puts函数写字符串  222

13.3.2  用scanf函数读字符串  223

13.3.3  逐个字符读字符串  224

13.4  访问字符串中的字符  225

13.5  使用C语言的字符串库  226

13.5.1  strcpy函数  226

13.5.2  strlen函数  227

13.5.3  strcat函数  228

13.5.4  strcmp函数  229

13.6  字符串惯用法  231

13.6.1  搜索字符串的结尾  232

13.6.2  复制字符串  233

13.7  字符串数组  235

问与答  238

练习题  241

编程题  243

第  14章  预处理器  246

14.1  预处理器的工作原理  246

14.2  预处理指令  248

14.3  宏定义  248

14.3.1  简单的宏  249

14.3.2  带参数的宏  250

14.3.3  #运算符  252

14.3.4  ##运算符  253

14.3.5  宏的通用属性  254

14.3.6  宏定义中的圆括号  254

14.3.7  创建较长的宏  255

14.3.8  预定义宏  256

14.3.9  C99中新增的预定义宏  257

14.3.10  空的宏参数  258

14.3.11  参数个数可变的宏  259

14.3.12  __func__标识符  260

14.4  条件编译  260

14.4.1  #if指令和#endif指令  260

14.4.2  defined运算符  261

14.4.3  #ifdef指令和#ifndef指令  261

14.4.4  #elif指令和#else指令  262

14.4.5  使用条件编译  262

14.5  其他指令  263

14.5.1  #error指令  263

14.5.2  #line指令  264

14.5.3  #pragma指令  265

14.5.4  _Pragma运算符  265

问与答  266

练习题  268

第  15章  编写大型程序  272

15.1  源文件  272

15.2  头文件  273

15.2.1  #include指令  273

15.2.2  共享宏定义和类型定义  274

15.2.3  共享函数原型  275

15.2.4  共享变量声明  277

15.2.5  嵌套包含  278

15.2.6  保护头文件  278

15.2.7  头文件中的#error指令  279

15.3  把程序划分成多个文件  279

15.4  构建多文件程序  285

15.4.1  makefile  285

15.4.2  链接期间的错误  287

15.4.3  重新构建程序  287

15.4.4  在程序外定义宏  289

问与答  289

练习题  291

编程题  292

第  16章  结构、联合和枚举  293

16.1  结构变量  293

16.1.1  结构变量的声明  293

16.1.2  结构变量的初始化  295

16.1.3  指示器  295

16.1.4  对结构的操作  296

16.2  结构类型  296

16.2.1  结构标记的声明  297

16.2.2  结构类型的定义  298

16.2.3  结构作为参数和返回值  298

16.2.4  复合字面量  299

16.2.5  匿名结构  300

16.3  嵌套的数组和结构  301

16.3.1  嵌套的结构  301

16.3.2  结构数组  302

16.3.3  结构数组的初始化  302

16.4  联合  309

16.4.1  用联合来节省空间  310

16.4.2  用联合来构造混合的数据结构  312

16.4.3  为联合添加“标记字段”  312

16.4.4  匿名联合  313

16.5  枚举  314

16.5.1  枚举标记和类型名  315

16.5.2  枚举作为整数  315

16.5.3  用枚举声明“标记字段”  316

问与答  316

练习题  318

编程题  323

第  17章  指针的高级应用  324

17.1  动态存储分配  324

17.1.1  内存分配函数  325

17.1.2  空指针  325

17.2  动态分配字符串  326

17.2.1  使用malloc函数为字符串分配内存  326

17.2.2  在字符串函数中使用动态存储分配  327

17.2.3  动态分配字符串的数组  327

17.3  动态分配数组  329

17.3.1  使用malloc函数为数组分配存储空间  329

17.3.2  calloc函数  330

17.3.3  realloc函数  330

17.4  释放存储空间  331

17.4.1  free函数  332

17.4.2  “悬空指针”问题  332

17.5  链表  332

17.5.1  声明结点类型  333

17.5.2  创建结点  333

17.5.3  ->运算符  334

17.5.4  在链表的开始处插入结点  335

17.5.5  搜索链表  337

17.5.6  从链表中删除结点  338

17.5.7  有序链表  339

17.6  指向指针的指针  344

17.7  指向函数的指针  345

17.7.1  函数指针作为参数  345

17.7.2  qsort函数  346

17.7.3  函数指针的其他用途  347

17.8  受限指针  350

17.9  弹性数组成员  351

问与答  352

练习题  355

编程题  358

第  18章  声明  359

18.1  声明的语法  359

18.2  存储类型  360

18.2.1  变量的性质  361

18.2.2  auto存储类型  361

18.2.3  static存储类型  362

18.2.4  extern存储类型  363

18.2.5  register存储类型  363

18.2.6  函数的存储类型  364

18.2.7  小结  365

18.3  类型限定符  366

18.4  声明符  366

18.4.1  解释复杂声明  368

18.4.2  使用类型定义来简化声明  369

18.5  初始化器  369

18.6  内联函数  371

18.6.1  内联定义  371

18.6.2  对内联函数的限制  372

18.6.3  在GCC中使用内联函数  372

18.7  函数指定符_Noreturn和头  373

18.8  静态断言  373

问与答  374

练习题  377

第  19章  程序设计  379

19.1  模块  379

19.1.1  内聚性与耦合性  381

19.1.2  模块的类型  381

19.2  信息隐藏  381

19.3  抽象数据类型  385

19.3.1  封装  385

19.3.2  不完整类型  386

19.4  栈抽象数据类型  386

19.4.1  为栈抽象数据类型定义接口  386

19.4.2  用定长数组实现栈抽象数据类型  388

19.4.3  改变栈抽象数据类型中数据项的类型  389

19.4.4  用动态数组实现栈抽象数据类型  390

19.4.5  用链表实现栈抽象数据类型  392

19.5  抽象数据类型的设计问题  394

19.5.1  命名惯例  394

19.5.2  错误处理  394

19.5.3  通用抽象数据类型  394

19.5.4  新语言中的抽象数据类型  395

问与答  395

练习题  396

编程题  397

第  20章  底层程序设计  398

20.1  位运算符  398

20.1.1  移位运算符  398

20.1.2  按位取反运算符、按位与运算符、按位异或运算符和按位或运算符  399

20.1.3  用位运算符访问位  400

20.1.4  用位运算符访问位域  401

20.2  结构中的位域  403

20.3  其他底层技术  405

20.3.1  定义依赖机器的类型  405

20.3.2  用联合来提供数据的多个视角  405

20.3.3  将指针作为地址使用  407

20.3.4  volatile类型限定符  409

20.4  对象的对齐  410

20.4.1  对齐运算符_Alignof  410

20.4.2  对齐指定符_Alignas和头  410

问与答  411

练习题  411

编程题  413

第  21章  标准库  414

21.1  标准库的使用  414

21.1.1  对标准库中所用名字的限制  415

21.1.2  使用宏隐藏的函数  415

21.2  C89标准库概述  416

21.3  C99标准库更新  417

21.4  :常用定义  418

21.5  :布尔类型和值  419

21.6  C11标准库更新  419

21.7  :地址的对齐  420

21.8  :宏noreturn的定义  420

问与答  420

练习题  421

编程题  422

第  22章  输入  输出  423

22.1  流  423

22.1.1  文件指针  424

22.1.2  标准流和重定向  424

22.1.3  文本文件与二进制文件  425

22.2  文件操作  426

22.2.1  打开文件  426

22.2.2  模式  427

22.2.3  关闭文件  428

22.2.4  为打开的流附加文件  428

22.2.5  从命令行获取文件名  429

22.2.6  临时文件  430

22.2.7  文件缓冲  431

22.2.8  其他文件操作  432

22.3  格式化的输入  输出  433

22.3.1  …printf函数  433

22.3.2  …printf转换说明  433

22.3.3  C99对…printf转换说明的修改  435

22.3.4  …printf转换说明示例  436

22.3.5  …scanf函数  438

22.3.6  …scanf格式串  438

22.3.7  …scanf转换说明  439

22.3.8  C99对…scanf转换说明的改变  441

22.3.9  scanf示例  441

22.3.10  检测文件末尾和错误条件  442

22.4  字符的输入  输出  444

22.4.1  输出函数  444

22.4.2  输入函数  444

22.5  行的输入  输出  446

22.5.1  输出函数  446

22.5.2  输入函数  447

22.6  块的输入  输出  447

22.7  文件定位  448

22.8  字符串的输入  输出  451

22.8.1  输出函数  451

22.8.2  输入函数  452

问与答  452

练习题  455

编程题  458

第  23章  库对数值和字符数据的支持  462

23.1  :浮点类型的特性  462

23.2  :整数类型的大小  464

23.3  :数学计算(C89)  465

23.3.1  错误  465

23.3.2  三角函数  466

23.3.3  双曲函数  466

23.3.4  指数函数和对数函数  467

23.3.5  幂函数  467

23.3.6  就近舍入函数、值函数和取余函数  468

23.4  :数学计算  468

23.4.1  IEEE浮点标准  469

23.4.2  类型  470

23.4.3  宏  470

23.4.4  错误  470

23.4.5  函数  471

23.4.6  分类宏  471

23.4.7  三角函数  472

23.4.8  双曲函数  472

23.4.9  指数函数和对数函数  473

23.4.10  幂函数和值函数  474

23.4.11  误差函数和伽马函数  474

23.4.12  就近舍入函数  475

23.4.13  取余函数  476

23.4.14  操作函数  477

23.4.15  值函数、小值函数和正差函数  477

23.4.16  浮点乘加  478

23.4.17  比较宏  478

23.5  :字符处理  479

23.5.1  字符分类函数  479

23.5.2  字符大小写映射函数  481

23.6  :字符串处理  482

23.6.1  复制函数  482

23.6.2  拼接函数  483

23.6.3  比较函数  484

23.6.4  搜索函数  485

23.6.5  其他函数  487

问与答  488

练习题  488

编程题  490

第  24章  错误处理  491

24.1  :诊断  491

24.2  :错误  492

24.3  :信号处理  494

24.3.1  信号宏  494

24.3.2  signal函数  494

24.3.3  预定义的信号处理函数  495

24.3.4  raise函数  496

24.4  :非局部跳转  497

问与答  499

练习题  500

第  25章  国际化特性  502

25.1  :本地化  502

25.1.1  类项  503

25.1.2  setlocale函数  503

25.1.3  localeconv函数  504

25.2  多字节字符和宽字符  507

25.2.1  多字节字符  507

25.2.2  宽字符  508

25.2.3  Unicode和通用字符集  508

25.2.4  Unicode编码  509

25.2.5  多字节  宽字符转换函数  510

25.2.6  多字节  宽字符串转换函数  511

25.3  双联符和三联符  512

25.3.1  三联符  512

25.3.2  双联符  513

25.3.3  :拼写替换  513

25.4  通用字符名  514

25.5  :扩展的多字节和宽字符实用工具  514

25.5.1  流的倾向性  515

25.5.2  格式化宽字符输入  输出函数  515

25.5.3  宽字符输入  输出函数  517

25.5.4  通用的宽字符串实用工具  518

25.5.5  宽字符时间转换函数  521

25.5.6  扩展的多字节  宽字符转换实用工具  521

25.6  :宽字符分类和映射实用工具  523

25.6.1  宽字符分类函数  524

25.6.2  可扩展的宽字符分类函数  525

25.6.3  宽字符大小写映射函数  525

25.6.4  可扩展的宽字符大小写映射函数  525

25.7  :改进的Unicode支持  526

25.7.1  带u、U和u8前缀的字面串  526

25.7.2  可重启动的多字节  宽字符转换函数  527

问与答  528

练习题  529

编程题  530

第  26章  其他库函数  531

26.1  :可变参数  531

26.1.1  调用带有可变参数列表的函数  533

26.1.2  v…printf函数  533

26.1.3  v…scanf函数  534

26.2  :通用的实用工具  534

26.2.1  数值转换函数  535

26.2.2  伪随机序列生成函数  537

26.2.3  与环境的通信  539

26.2.4  搜索和排序实用工具  540

26.2.5  整数算术运算函数  542

26.2.6  地址对齐的内存分配  542

26.3  :日期和时间  542

26.3.1  时间处理函数  543

26.3.2  时间转换函数  545

问与答  550

练习题  552

编程题  553

第  27章  C99对数学计算的新增支持  554

27.1  :整数类型  554

27.1.1  类型  555

27.1.2  对指定宽度整数类型的限制  555

27.1.3  对其他整数类型的限制  556

27.1.4  用于整型常量的宏  557

27.2  :整数类型的格式转换  557

27.2.1  用于格式指定符的宏  557

27.2.2  用于宽度整数类型的函数  558

27.3  复数  559

27.3.1  复数的定义  559

27.3.2  复数的算术运算  560

27.3.3  C99中的复数类型  561

27.3.4  复数的运算  561

27.3.5  复数类型的转换规则  562

27.4  :复数算术运算  562

27.4.1  宏  562

27.4.2  CX_LIMITED_RANGE编译提示  563

27.4.3  函数  564

27.4.4  三角函数  564

27.4.5  双曲函数  565

27.4.6  指数函数和对数函数  565

27.4.7  幂函数和值函数  566

27.4.8  操作函数  566

27.5  :泛型数学  567

27.5.1  泛型宏  568

27.5.2  调用泛型宏  569

27.6  :浮点环境  570

27.6.1  浮点状态标志和控制模式  570

27.6.2  宏  571

27.6.3  FENV_ACCESS编译提示  571

27.6.4  浮点异常函数  572

27.6.5  舍入函数  573

27.6.6  环境函数  573

问与答  573

练习题  574

编程题  575

第  28章  C1X新增的多线程和原子操作支持  576

28.1  :多线程执行支持  577

28.1.1  线程启动函数  577

28.1.2  线程的创建和管理函数  578

28.1.3  数据竞争  581

28.1.4  互斥函数  583

28.1.5  条件变量  585

28.1.6  条件变量函数  587

28.1.7  递归锁和非递归锁  591

28.1.8  初始化函数  591

28.1.9  _Thread_local  存储类和线程存储期  593

28.1.10  线程专属存储  595

28.1.11  线程专属存储函数  596

28.2  _Atomic、:原子类型和原子操作支持  599

28.2.1  _Atomic:类型指定符  类型限定符  600

28.2.2  标准库定义的原子类型  600

28.2.3  初始化原子变量  601

28.2.4  原子变量的初始化函数  601

28.2.5  原子操作  602

28.2.6  原子操作函数  604

28.2.7  内存顺序  608

28.2.8  围栏函数  613

28.2.9  锁无关判断函数  615

28.2.10  原子标志类型及其操作函数  616

问与答  619

练习题  619

编程题  620

附录A  C语言运算符  621

附录B  C1X与C99的比较  622

附录C  C99与C89的比较  624

附录D  C89与经典C的比较  628

附录E标准库函数  631

附录F  ASCII字符集  673

延伸阅读  674

索引(图灵社区下载)

展开预览

评论

r90548039
有這樣的電子書, 我的紙本書. 基本上都可以回收掉了..
2024-09-21 15:05:26
G886
非常清楚,谢谢!
2023-10-06 10:14:40
登录/注册

意见反馈

求资源

回顶部

推荐内容

热门活动

热门器件

随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
×