图书目录

目  录

上部  形而下学——代码错误及陋习

第1章  低级错误 3

问题1  C啊,多少C++假汝之名而行——C、C++不分 4

问题2  环节缺失——关于C程序开发过程 7

问题3  错误的“标点”——混用中英文字符 9

问题4  错误的“单词” 11

问题5  “合并单词”产生的问题 12

问题6  形形色色的“分号”误用 13

问题7  “一仆二主”——两个main()函数 15

问题8  忘记“&” 17

问题9  who’s who 18

问题10  同形异质——为符号常量赋值 19

问题11  词不达意 20

问题12  使用switch语句的常见错误 21

第2章  初级错误 23

问题1  随手写出的大数 24

问题2  关于数据类型的潜规则 25

问题3  使用垃圾值 26

问题4  对数组的误用与误解 28

问题5  好心办坏事——修改代码引发的错误 30

问题6  “右移运算等价于除法运算” 32

问题7  “中国人民很行”——C语言中的错别字 33

问题8  学会数数——循环次数错误 34

问题9  忽视函数原型 36

问题10  张冠李戴——错误的格式转换 37

问题11  只进不出——缺少输出 39

问题12  鸠占鹊巢——数组越界 41

第3章  逻辑错误 45

问题1  喧宾夺主——换行问题 46

问题2  结构体链表的一个例题——输出错误 47

问题3  一些幼稚的写法 50

问题4  c=getchar()!=EOF——优先级错误 50

问题5  判断三个整数相等——“==”运算符的误用 51

问题6  悬挂else问题——怎样写出正确的if语句 52

问题7  浮点循环变量 53

问题8  不顾常识 55

问题9  自然语言的陷阱 57

问题10  c==' ' || '\n' || '\t' 58

问题11  乱做习题你伤不起啊 59

问题12  误改循环变量 62

第4章  似是而非 65

问题1  void main() 66

问题2  生硬的嫁接,滑稽的实参 66

问题3  输出之误——输出数组应注意的问题 70

问题4  多此一举 73

问题5  笨拙的for语句 74

问题6  只用printf()函数输出 76

问题7  容易招致编译器误解的代码 76

问题8  使用“//”注释注意事项 77

问题9  使用野指针 78

问题10  用驴子拖宝马——滥用结构体 79

问题11  似是而非的k=sqrt(n) 84

问题12  scanf("%s",&str) 88

问题13  已知两边长求三角形面积——不完全函数参数 89

问题14  对“c”转换说明符的误解 92

问题15  多余的计算 93

问题16  到处忙活与一劳永逸——函数类型声明位置问题 96

问题17  半身不遂和粗中有细 99

问题18  忽视前提 103

问题19  char text[3][80]不是一篇文章,也并非3行文字 104

问题20  不安全的gets()函数 108

问题21  文件名残缺 109

问题22  exit(0) 110

问题23  舍近求远 112

问题24  重复无效的代码 114

问题25  拙劣的外部变量 114

第5章  画蛇添足 129

问题1  KISS 130

问题2  为赋新词强说愁 131

问题3  啰唆重复 132

问题4  表达式是什么 133

问题5  不识指针 134

问题6  脱裤子放屁 136

问题7  怎样利用scanf()函数自虐 138

问题8  自寻烦恼的scanf()函数调用方式 139

问题9  输入指定范围的整数——Basic风格写法和C风格写法 140

问题10  “豆浆买两碗,喝一碗,倒一碗”——多余的数组元素 143

问题11  筛法“四不像” 146

问题12  不彻底的思考 152

问题13  代码写得要“拽”(DRY) 156

问题14  作茧自缚的“%3d” 158

问题15  大腹便便——臃肿与重复 160

问题16  舍简就繁 161

问题17  程序的劣化与优化 163

问题18  滥用变量综合症 172

问题19  free空指针 174

第6章  疑难杂症 177

问题1  混乱是怎样炼成的 178

问题2  无知乱吃药——strcpy()函数的误用 183

问题3  边界测试——让BUG现形 186

问题4  内裤外穿——错位及不伦不类 192

问题5  flag标志:代码馊了(一) 196

问题6  flag标志:代码馊了(二) 202

问题7  flag标志:代码馊了(三) 210

问题8  鸡窝里飞出伪凤凰 216

问题9  不顾常识 221

问题10  不易察觉的BUG 222

问题11  含糊之过、多做之过及乱做之过 224

问题12  怎样调戏程序 230

问题13  糟蹋好题——魔方阵问题 236

第7章  风格问题 249

问题1  如何进行数组初始化 250

问题2  括号不配对错误及如何免疫 251

问题3  不良代码编辑风格引起的错误——怎样写控制语句 252

问题4  将main()函数进行到底 253

问题5  赤裸的scanf() 257

问题6  c + 32的问题 257

问题7  怎样整理房间 259

问题8  贪小便宜——省略函数类型声明等问题 262

问题9  常数Magic Number 265

问题10  搏二兔 269

下  部  形而上学——概念错误及误区

第8章  概念的缺失 277

问题1  C语言的历史及C标准 278

问题2  只知变量不知对象 278

问题3  C语言中Byte的含义 280

问题4  “不知所云”的无定义行为(undefined behavior) 281

问题5  “可以清心也”应如何解读——不确定行为

(Unspecified behavior) 283

问题6  实现(Implemantation) 285

问题7  “编译器自己做主”——实现定义的行为 

(implementation-defined behavior) 285

问题8  整数提升(Integer promotion) 285

问题9  副效应(side effects) 286

问题10  “左值就是可以出现在赋值运算符的左侧” 287

第9章  基本词法 289

问题1  字符集问题 290

问题2  “α,β,δ,ε,Ⅰ,Ⅱ,Ⅲ,Ⅳ等不是C语言的合法字符” 291

问题3  “各种字符集的基本集都包括了127个字符” 291

问题4  C源程序的组成——“单词”视角 292

问题5  “a”、‘a’与a辨析 293

问题6  “C语言关键字都是小写的” 294

问题7  “C语言允许一行内写多个语句” 294

问题8  “标识符由字母、下划线和数字组成” 295

问题9  标识符的长度限制 295

问题10  “括号、赋值、逗号都是运算符” 296

第10章  数据类型及类型转换 297

问题1  “类型就是对数据存储单元的安排” 298

问题2  1.%3之惑 298

问题3  “int为2个字节或4个字节” 299

问题4  int类型的范围问题 299

问题5  混乱不堪的“整型” 300

问题6  “?345是整型常量” 300

问题7  “字符数据以ASCII码存储” 301

问题8  “char类型就是signed char类型” 301

问题9  通过程序测定char类型的性质 302

问题10  “C用1个字节(8位)存储一个字符” 302

问题11   “i='A'是字符型数据赋给整型变量” 303

问题12  “字符常量只能是一个字符” 303

问题13  “从常量的表示形式可以判断其类型” 303

问题14  1、'1'与"1" 304

问题15  “变量值在存储单元中都是以补码形式存储的” 304

问题16  “不应向无符号整型变量赋予一个负值” 305

问题17  3.0乘以4.2怎么就变成了12.59999 306

问题18  “实型变量”剖析 307

问题19  使用float招来的警告及“因噎废食”的对策 307

问题20  123f——怎样写float类型的常量 309

问题21  “实型常量有两种表示形式” 309

问题22  “浮点数类型包括float、double和long double” 310

问题23  “实数就是浮点数” 310

问题24  “编译系统为每一个float型变量分配4个字节” 310

问题25  “浮点型”、“双精度浮点型”和“实型” 311

问题26  “Turbo C对long double 型分配16个字节” 311

问题27  “必然以规范化的指数形式输出” 311

问题28  “浮点型数据是用来表示具有小数点的实数的” 312

问题29  对类型转换运算的误解 312

问题30  “整型量与字符型数据以及逻辑型数据可以通用” 312

问题31   “C语言把所有的实数都作为双精度数处理” 314

问题32  “所有float型数据都先转换为double型” 314

问题33  “int型与float或double型数据进行运算,结果是double型” 315

问题34  关于char类型数据的运算规则 316

问题35  对表达式“10+'a'+i*f-d/3”的分析 316

问题36  “字符数据既可以字符形式输出,也可以整数形式输出” 318

问题37  3 ? 1∶2. 319

问题38  “运算符两侧的数据类型不同,先自动进行型转换” 319

第11章  运算和表达式(Expression) 321

问题1  关于“整型常量” 322

问题2  “变量名是以一个名字代表一个存储地址” 323

问题3  “缺省情况下所有变量都是auto 的” 324

问题4  “不能对一个类型赋值、存取或运算” 324

问题5  “变量必须先定义、后使用” 324

问题6  “常量是没有名字的不变量” 325

问题7  “标识符用来标识一个对象” 325

问题8  啥叫“中间变量” 326

问题9  “先乘除后加减”——“优先级高先运算” 326

问题10  “赋值截断” 326

问题11  对(a=b)>0 的误读 327

问题12  “‘.’运算符优先级高于后缀‘++’运算符” 327

问题13  “‘结合性’是C语言的特点之一” 327

问题14  “‘左结合性’,即运算对象先与左面的运算符相结合” 328

问题15  “算术表达式”和“算术运算符”:两个臆造的伪概念 328

问题16  关于“算术表达式”、“优先级”和“结合性”的胡扯 330

问题17  “C语言共有34种运算符” 333

问题18  “两个实数相除的结果是双精度实数” 334

问题19  整数除法的舍入方向问题 335

问题20  “++运算的作用是使变量的值加1” 335

问题21  为a+=a-=a*a预拟的悼词 335

问题22  &&的运算规则 339

问题23  对“5>3&&8<4-!0”的分析 340

问题24  逻辑运算符和逻辑表达式 341

问题25  “二元运算符都可以与赋值符一起组合成复合赋值符” 342

问题26  “赋值运算符的作用是将一个数据赋给一个变量” 343

问题27  “执行表达式a=(b=5),就是执行b=5和a=b两个赋值表达式” 343

问题28  类型系统?表达式?副效应?——C的“易筋经” 343

问题29  GB/T15272-94的一个错误 346

问题30  sizeof“函数” 347

问题31  逗号运算符是几目运算符 348

问题32  怎样滥用逗号运算符 348

问题33  “逗号运算符最常用于循环语句” 349

问题34  同名不同义的运算符:“++”与“++” 350

问题35  ++、--的运算对象问题 351

问题36  自增运算符(++)不能用于表达式 351

问题37  cast运算的优先级问题 352

第12章  声明和语句 355

问题1  “全局变量” 356

问题2  声明外部变量时省略类型名称 356

问题3  声明点(Declaration point)的问题 358

问题4  指向静态整型变量的指针 359

问题5  存储类别 359

问题6  “输出语句”及“赋值语句” 360

问题7  “函数调用语句” 360

问题8  “C语言规定语句末尾必须有分号” 361

问题9  switch语句的一般形式 362

问题10  switch语句中的表达式类型问题 363

问题11  “while语句的范围只到while后面第一个分号处” 364

问题12  “for语句和while语句无条件等价” 364

问题13  “语句的作用是向计算机系统发出操作指令,要求执行相应的

操作” 365

第13章  函数 367

问题1  “实际参数可以是常量、变量或表达式” 368

问题2  “函数调用的形式” 368

问题3  “虚拟参数”和“虚实结合” 369

问题4  “值传递”和“址传递” 369

问题5  函数的指针是起始地址 371

问题6  用指针调用函数 371

问题7  “void意为函数无类型” 372

问题8  “函数必须‘先定义后使用’” 372

问题9  “使用函数原型作声明是C的一个重要特点” 373

问题10  “函数体包括声明部分和执行部分” 373

问题11  “库函数是编译系统事先定义好的” 374

问题12  “定义无参函数的一般形式” 374

问题13  “不带回值的函数的函数体中不得出现return语句” 374

问题14  过时的函数定义 375

问题15  “不能调用main函数” 376

问题16  “C程序在main()函数中结束” 376

问题17  五花八门的main()函数 377

问题18  “函数名代表函数的入口地址” 384

问题19  “函数声明”、“函数原型”与“函数定义”辨析 385

第14章  指针 389

问题1  指针的种类问题 390

问题2  “指针就是一个变量” 390

问题3  “指针就是地址” 391

问题4  “一元‘&’是取地址运算符” 393

问题5  错误观念下的代码 393

问题6  返回指向局部变量的指针 396

问题7  野指针问题 396

问题8  “指针是32位的无符号的整数” 397

问题9  “指针的大小都一样” 397

问题10  “无类型指针” 397

问题11  指针加减法运算的“定义域” 398

问题12  const 悖论 400

问题13  不经意的错误:&a[10] 与a+10的差异 403

问题14  新编《守株待兔》——C语言版——兼聊为什么不应该用%d

格式转换输出指针 403

第15章  数组和字符串 407

问题1  定义一维数组的一般形式 408

问题2  何谓“可变长数组” 408

问题3  “字符串是存放在字符型数组中的” 409

问题4  “数组中未被赋值的元素的值自动置'\0'” 410

问题5  “数组名不是左值” 411

问题6  数组名“只代表数组首元素的地址” 412

问题7  辨析“形参和实参可以分别用字符数组名或字符指针变量” 414

问题8  关于strncpy()函数的功能 415

问题9  “数组名作函数参数”问题 416

问题10  怎样称呼字符串 418

问题11  小气的数组和危险的输入——慎用scanf()函数和gets()函数 420

问题12  修改字符串文字量 421

问题13  对strcpy()功能断章取义的描述 422

第16章  结构体、共用体、枚举及位运算 425

问题1  成员运算问题 426

问题2  “->”称为指向运算符 426

问题3  “只能对最低级的成员进行赋值或存取以及运算” 426

问题4  63、64还是68?——谈谈alignment 428

问题5  结构体的尺寸问题 431

问题6  空结构体的尺寸问题 431

问题7  “结构体变量的地址主要用作函数参数” 432

问题8  “共用体变量所占内存长度等于最长成员的长度” 432

问题9  “不能引用共用体变量” 433

问题10  “不能对共用体变量名赋值” 435

问题11   “枚举变量的值限定在定义时规定的几个枚举元素范围内” 435

问题12  “‘位运算’是C语言区别于其他高级语言的一个重要特点” 436

问题13  “参加位运算的对象只能是整型或字符型的数据” 437

问题14  “‘<<’用来将一个数的各二进制位全部左移若干位” 438

问题15  不同长度的数据进行位运算 439

问题16  用memcmp()函数比较两个结构体 439

第17章  标准库 441

问题1  “%c转换说明符用于输入单个字符”引发的潜在BUG 442

问题2  “对无符号整型数据用%u输出” 442

问题3  “double类型应该用‘%lf’输出” 443

问题4  关于%g格式的错误认识 443

问题5  关于%o格式的错误认识 444

问题6  “gets()函数是fgets()函数用于stdin的特例” 445

问题7  “用puts函数输出的字符串中可以包含转义字符” 447

问题8  “文件结束标志EOF(即-1)” 447

问题9  “fseek(fp、100L、0)” 448

问题10  打开文件时的两种错误 448

问题11  “用"a"方式打开文件应保证文件事先存在” 449

问题12  “在程序中可以直接用FILE类型名定义变量” 449

问题13  “stdin是指向标准输入流的指针变量” 449

问题14  关于feof()函数的错误 450

问题15  “度日如年”的故事及“feof()函数”的故事 450

问题16  关于fflush()函数的错误 455

问题17  盲目前行——忽视malloc()函数返回值 457

问题18  管杀不管埋——缺少free()函数 458

问题19  怎样建立链表并同时造成内存泄漏 459

问题20  qsort()函数是快速排序 462

问题21  关于calloc()函数 462

问题22  关于free()函数 463

问题23  关于realloc()函数 464

问题24  为什么不可以static char*p=malloc(10); 464

问题25  abs()是数学函数 465

第18章  预处理 467

问题1  “预处理功能是C语言特有的” 468

问题2  主动引进BUG 468

问题3  “#define是用一个指定的标识符来代表字符串” 469

问题4  “预处理器把程序中的注释全部删除” 470

问题5  “所有的PI都代表3.1416” 470

问题6  #define预处理命令的位置问题 471

问题7  能否用痰盂盛饭——谈在头文件中定义外部变量 472

问题8  预处理次序错误 475

问题9  缺少#include 476

问题10  包含源文件——是奇技淫巧还是饮鸩止渴 476

问题11  使用函数式宏的禁忌 480

问题12  不合格的宏 481

问题13  “宏实参从左到右进行置换” 481

问题14  条件编译与if语句 482

第19章  关于C99 485

问题1  亡羊补牢还是越错越远——“C99允许在函数中的复合语句

中定义变量” 486

问题2  C99增加了哪些数据类型 488

问题3  “C99标准不支持一行内写多个语句” 489

问题4  “C99把字符型数据作为整数类型的一种” 489

问题5  “C99要求main函数一律指定为int型” 489

问题6  “C99允许使用常变量” 490

问题7  “C99允许使用多字节字符” 490

问题8  “C99允许使用基类型为void的指针类型” 490

问题9  “C99增加了C++中的功能” 490

问题10  “C99允许同类型的共用体变量互相赋值” 491

问题11  能否用Visual C++ 6.0学习C99 491

第20章  杂七杂八 493

问题1  “系统描述语言”与“系统编程语言” 494

问题2  关于计算机指令长度 494

问题3  同一律 494

问题4  为什么不能用汇编解释C 495

问题5  “文件中的物理顺序” 495

问题6  “C语言源程序的扩展名为.c” 496

问题7  缺乏测试意识 496

问题8  为Wirth正名 499

问题9  “bohra”是谁 500

问题10  “83 ANSI C”和“87 ANSI C” 500

问题11  关于ISO 501

问题12  关于勒让德多项式 501

参考文献 502