《最优C/C++编程秘诀》求取 ⇩

第一部分C和C+++语言3

第一章 十种避免常见C语言编程错误的方法3

1、在使用所有数据之前须先将其初始化4

2、不能将堆栈里的对象作为指针返回值4

3、当给字符串分配空间时,不要忘记空字符“\0”5

4、请注意数组的最后一个元素的序号值比该数组的大小少一5

5、使用函数原型6

6、在表达式中使用char类型时要小心7

7、不要混淆逻辑运算符与位运算符8

8、不要依赖表达式的运算次序9

9、函数形参的运算次序没有定义10

10、不要混淆“=”和“==”运算符10

第二章 标识符与数据11

11、不要用C+++的关键词作为C语言程序的标识符12

12、避免标识符含有双下划线或以下划线作为标识符的起始符12

13、避免临时定义12

14、如何编排长字符串13

15、文件路径要用双反斜杠来表示13

16、在一字符串中加入十六进制常数时要谨慎13

17、转义符必须小写14

18、何时需在问号(?)前加转义符14

19、何时使用三元符14

20、如果编辑器和程序使用同一扩展字符集则可以在字符串中使用扩展字符15

21、对于小整数使用char型定义,效果并不好15

22、枚举类型常量比#define语句更方便15

24、数组在函数调用时是作为指针传递的17

23、当说明一个enum型的变量时没有必要使用enum关键字17

25、只有针对函数的形式参数而言,数组与数组的指针是等价的18

26、如果形式参数是多维数组,须定义其大小18

27、对于多维数组形式参数,第一维的大小是随意的19

28、不恰当的对大型多维数组的操作会导致系统颠簸19

29、允许超出数组一个单位的元素,但只能是超出一个20

30、下标运算符位置可以交换20

31、C语言没有定义一种决定数组边界的方式21

32、如果变量或函数在一模块中是私有的,将其定义为static型22

33、一个函数内部的static型数据项在多个函数调用期间将被保存22

34、对于内部初始化的数组,static型数组很有用23

36、const修饰符单独使用同const int等价24

35、如果不允许函数修改一个数组参数,那么将其说明为const型24

37、怎样说明常量指针25

38、使用现代编译器后没有必要再用register说明25

39、何时使用volatile修饰符26

40、一个变量可同时说明为const和volatile26

41、在一条语句中定义几个指针时,要谨慎26

第三章 函数与运算符29

42、如果函数没有形式参数,应将其原型说明为void30

43、传统函数定义将float类型视为double型30

44、main函数应返回一个结果31

45、读程序命令行参数31

46、尽可能不要使用递归函数32

47、如果函数没有返回,说明其为void33

49、避免对浮点数进行相等比较34

48、对定点数应避免使用浮点运算34

50、谨慎整数表达式中会出现暂时溢出35

51、避免在除法运算中混合使用符号数与无符号数35

52、如果一个除法式中两个操作之一是负数,那么其结果的取整值取决机器的运行36

53、避免进行符号与无符号数的比较36

54、逻辑运算是从左向右进行求值直至获得表达式的值36

55、逻辑非运算符!在测试是否为零时非常有效37

56、赋值号可以连在一起37

57、了解前缀“+++、--”与后缀“+++、--”的不同之处38

58、位运算符对存储标志很有用处38

59、给字中的某些位消零,使用取反运算符39

60、要反置一位,可用异或运算符39

61、怎样使用位运算符压缩小数值40

62、算术移位与逻辑移位的区别41

63、认清赋值运算符41

64、条件表达式作为函数参数特别有效42

65、条件表达式的优先级较低43

66、位运算的优先级低于关系运算符43

67、在C语言中,分程序块标识符对函数内变量的局部化十分有效43

68、在一个嵌套的if语句中,else语句与其前的if语句相匹配44

69、switch语句比嵌套if—else语句更有效45

70、break语句放在switch语句中最后一个case语句后46

71、可在while循环体内初始化和测试变量46

72、逗号运算符可用于for循环内多于一个循环变量的处理情况47

73、不要混淆break与continue语句47

75、for循环中的初始表达式是可任意的48

74、通过检验循环变量可以判断循环语句是否执行了break语句48

76、自加符“+++”只增加指针的值,而不增加指针所指向内容的值49

77、当查询一数组时,使用数组指针要比使用数组下标更迅速49

78、当有嵌套时,数组指针比多维数组更有效50

79、使用函数指针作为回调51

80、用typedef来定义函数指针52

81、理解复杂的说明52

82、使用typedef来命名一个结构53

83、ANSIC允许结构赋值54

84、当想传递一指针时,不要无意中传递结构参数54

85、如果要给数组赋值,请将其置于结构中55

86、当存储标志时,位字段提供另一种屏蔽方法55

87、可用位字段存储小的数值56

89、谨慎未初始化的指针57

88、位字段是运行依赖的57

90、C语言不允许做指针加法,但可以做减法58

91、弄清当指针加1时,将会发生什么58

92、空指针59

93、null指针不必每位都是零60

94、在ANSIC对void型指针使用类型转换60

95、何时使用多级指针61

第四章 C+++说明语句63

96、在C+++中,当定义变量时,没有理由不将其初始化64

97、怎样使用缺省形式参数64

98、用缺省形参来扩展一个已非常广泛使用的函数64

99、可在for和while条件语句中说明循环变量65

100、如果在for和while条件语句中说明变量,那么它在该语句后的作用域内仍有效65

102、如果在一case语句中初始化变量,那么须将此case语句封闭在一个块中66

101、一个变量若是定义在条件语句内,则不能在该条件语句作用域外被访问66

104、∷运算符可存取隐含在当前作用域中的数据项67

103、在C+++语言中,可取出一个寄存器的变量地址67

105、条件运算符可写在表达式的左边68

106、可以从普通C的structure中导出class(类)69

107、使用引用(reference)作为函数的形参70

108、使用引用作为返回类型71

109、处理出现在返回reference型函数中的错误条件值71

110、何时使用内联函数72

111、定义在类说明语句中的函数自动设置为内联函数73

112、使用内联函数来访问一些私有成员73

113、隐含类数据可方便地改变程序执行73

114、引用型成员函数可读写成员75

116、何时使用虚拟(Virtual)函数76

115、如何在类库中使用已被保护的成员76

117、一般情况下,不要说明函数为Virtual型78

118、对于导出类的Virtual函数没有必要使用Virtual关键词78

119、在使用Virtual函数时一个常见的错误就是仅在某一类中改变形参类型79

120、使用带有纯Virtual函数的抽象类79

121、纯虚拟函数可以被定义80

122、必须在导出类中重新定义所有纯Virtual函数,否则导出类将也是抽象的81

123、如果纯Virtual函数非正确导出,编译器将会指出错误81

124、当不使用Virtual函数全部形参时,如何避免警告82

125、基本类中应含有虚拟析构函数(Virtual Destructor)83

126、当没有一个导出类含有Destructor时,基本类可省略Virtual Destructor83

127、弄清成员指针83

128、如何使用指向成员函数的指针84

129、对非静态函数运用Callbacks85

130、使用Template来实现成员函数指针87

131、说明静态类成员89

132、不要在头文件中给出静态数据定义89

133、静态成员函数仅能访问静态数据89

134、使用静态指针来指定活动的对象90

135、使用全静态类来组合函数90

136、Const可取代#define或enum语句91

137、如何在类中说明数组的大小92

138、C+++的程序怎样调用C函数92

139、如何使头文件在C与C+++中可移植93

第五章 创建和撤消C+++对象95

141、C+++允许删除空指针96

140、怎样使用New和Delete会导致内存泄漏96

142、当在一个类中使用指针时,应在构造函数中首先将它们置成空指针,然后在析构函数中将它们删除97

143、当一个类包含指针成员时,在类中说明一个拷贝构造函数和一个赋值运算符98

144、书写赋值运算符时,牢记X=X100

145、拷贝构造函数可以调用赋值运算符100

146、当类无须拷贝时,说明拷贝运算符为私有,而无须对它们定义101

147、在重定义赋值运算符时,必须拷贝所有的成员101

148、赋值运算符不能被继承103

149、除了在构造函数中,其它情况下给指针赋值前,都必须删除原先的内容104

150、如果在析构函数以外释放指针,应紧随其后将该指针置为空指针104

151、可为类提供一个初始化函数,而不必使用构造函数105

152、试图使New和Delete运算符局限于一个单独类中106

153、如何将New和Delete重新定义为全局运算符108

154、一个类可以有自己的New和Delete运算符109

155、一个重载的Delete运算符能够接受一个任意大小的参数110

156、如何为New运算符指定布局参数111

157、当类重新定义使用布局参数的New运算符时,它也应提供一个不带参数的New运算符112

158、如何在一个固定分配缓冲区分配类对象113

159、在重新定义New运算符时,也需重新定义Delete运算符114

160、当New运算符被重新定义时,如何重新定义Delete运算符114

161、全局New常用于创建对象数组,即使类重新定义了New运算符116

162、用Delete[]运算符撤消数组116

163、一个重定义的New和Delete运算符如何处理导出类117

164、如何重定义New去查找内存泄漏118

165、为特定类优化New119

166、对于虚拟存储系统,New函数怎样会导致系统颠簸121

167、重载new而不使用set-new-handler121

168、若一个类不含显式构造函数,编译程序将提供缺省的构造函数122

169、说明带参数的构造函数,将屏蔽缺省的构造函数122

170、一个带有缺省参数的构造函数等同于缺省的构造函数123

171、当类已屏蔽缺省构造函数时,导出类必须提供构造函数124

172、即使基本类型也有构造函数124

173、如何构造临时对象125

174、避免在函数调用时,创建临时对象125

175、不要从同一类的另一构造函数中调用缺省构造函数126

176、理解拷贝构造函数127

177、拷贝构造函数必须带常量参数127

179、虚拟构造函数128

178、拷贝构造函数可以带有另外的缺省参数128

180、一个虚拟构造函数的虚拟模拟函数129

181、为什么一个析构函数未被调用130

182、如何在一个构造函数的初始化表中,对成员项初始化131

183、不能使用初始化表初始化导出类成员134

184、如何显式调用析构函数134

185、自动类型的对象仅当超出它们所在的块时被撤消135

186、当临时对象不再被调用时,它们将被释放136

187、尽早使用一个程序块去撤消自动型对象136

188、确保全局对象在使用前被初始化137

第六章 类型转换和重载139

189、转换成类140

190、一个带有缺省参数的构造函数也能用作类型转换140

192、将类转换成另一类型141

191、用类型赋值运算符来避免创建临时对象所产生的额外开销141

193、如有可能,仅为基本类型和库函数提供转换运算符142

194、如在两类间既说明了一个转换运算符又说明了一个转换构造函数,将可能产生二义性143

195、记住转换运算符也可以是虚拟的143

196、当说明类型转换及重载表达式时,请注意二义性问题143

197、警惕过多使用类型转换144

198、什么时候重载函数144

199、当调用重载函数时,使用常量后缀146

200、当调用重载函数时避免二义性146

201、Const特性对于区分重载函数的参数已足够了147

202、对象的Const特性已足够区分重载的成员函数147

203、切记,函数重载不可通过函数指针完成148

204、用重载代替缺省参数149

205、用重载函数设置或返回类中成员值150

206、运算符表151

207、什么时候重载运算符151

208、注意运算符的运算优先级151

209、将二元运算符定义为友元函数152

210、=、()、[]和->运算符必须是成员函数153

211、将运算符参数说明为常量引用154

212、前缀和后缀自加与自减运算符的差异154

213、前缀运算符对自加或自减的对象更有效154

214、重载运算符的返回类型未被定义155

215、理解函数调用运算符156

216、使用带有非整数参数的下标运算符157

第七章 继承和成员访问控制159

217、在C+++中,Struct是公有类160

218、在说明结构时,无需使用typedef160

219、指定存取说明符时,不必保持成员次序161

220、限制成员存取并不影响其可视性161

221、当私有派生时,如何选择存取权限162

222、当基本类被公有继承时,不可取消基本类中特定成员的存取权限163

223、避免使成员数据公有163

224、当一个类从C的结构继承时,使其私有派生163

225、何时公有派生164

226、何时私有派生164

227、当编写Template类时,从私有基本类派生165

228、在Template基本类中,使用保护成员167

230、解决多重继承的二义性168

229、谨慎使用多重继承168

231、使用虚拟基本类169

232、不要将所有类定义为虚拟类171

233、解决多重继承中二义性的虚拟函数调用171

234、如何避免过多的虚拟基本类函数调用173

235、虚拟基本类必须被任何导出类初始化175

236、用多重继承转换一个类可以改变指针值177

237、当从无关联基本类导出时,多重继承是易实现的178

238、用隐含类代替多重继承178

239、为多重继承设计类180

第八章 C+++技术183

240、当两个类彼此引用时184

241、在执行文件中包含被引用的类185

242、将类分层(级)来屏蔽执行细节186

243、为指针保留引用计数值188

第九章 预处理193

244、使用宏实现条件编译194

245、用宏作为标志195

246、用#if0语句来实现代码的注释196

247、在宏和函数之间提供一个选择196

248、#include“文件名”和#include〈文件名〉之间的差别197

249、include语句中的文件名可以是一个宏197

250、include中的文件可以嵌套198

251、怎样避免多次嵌入头文件198

252、头文件中不应该包含有变量数据200

253、用#deeine语句说明一个常量200

254、使用函数宏200

255、使用括号定义函数宏201

256、扩充一个宏成多行202

257、使用字符化运算符202

258、用字符化运算符来扩展宏203

259、使用连接运算符203

260、用连接运算符定义类型函数204

261、使用预定义宏205

262、使用#error指令206

263、pragma指令的作用206

264、使用#line指令207

265、标识#endif指令207

266、怎样写一个多语句的宏208

267、怎样按照整型的长度有条件地编译209

268、用预处理仿真C+++样板210

第十章 程序设计风格问题213

269、在一个数据项的名字中指出它的类型214

270、使用较长的描述性名字214

271、两个命名惯例215

272、命名循环计数器216

273、命名宏216

274、类型定义(typedefs)217

275、C+++类的命名217

276、类对象的命名218

277、函数的命名218

278、命名作为数据包容使用的函数成员219

279、使用花括弧的三种风格221

281、划分if和while语句223

280、表达式的写法223

282、怎样划分for语句225

283、长的函数调用怎样划分225

284、把else if语句当作一个语句对待226

285、尽量避免使for和while语句的语句体为空226

286、将do语句中的while放到紧接do语句的右括号之后的同一行上227

287、switch语句的格式227

288、函数定义的写法228

289、定义类的两种方法229

290、编排内联函数230

291、分隔内联函数230

292、预处理语句不一定必须从第一列开始231

293、让编译器来优化表达式232

第十一章 标准C库函数237

第二部分 库函数237

294、使用支持库函数的头文件238

295、使用C的库函数后应该检查错误信息238

296、一个函数调用成功时,errno中也可能包含有一个代码238

297、main之后的退出函数238

298、memcpy函数不处理重叠区239

299、用swab函数交换字节的顺序240

300、在长整型上交换字节顺序240

301、用getenv读取环境变量241

302、使用字符分类函数241

303、创建唯一的文件名242

304、获取有关文件信息243

307、选择流或低级文件I/O244

305、用seek函数找出文件的长度244

306、文件I/O字符例程使用整型244

308、用“W”方式打开一个已存在的文件会使文件被重写245

309、在修改方式进行读写245

310、用freopen重定向标准流245

311、重定向标准流回到原来状态246

312、何时使用上锁函数247

313、calloc函数初始化数据为0247

314、calloc或memset不能用于初始化指针和浮点数248

315、用Time作为随机数种子248

316、用qsort函数排序数组248

317、使用带qsort函数的样板250

318、在qsort函数中使用指针数组251

319、在排好序的数组中查找252

320、使用assert函数252

321、在维护失败时设置断点253

322、用Strf time格式化时间254

323、strftime与流结合起来格式化日期和时间255

324、使用strrchr函数提取一个文件路径中的文件名256

325、用strcat函数合并字串时,要给它分配存储空间257

326、sprintf函数也可以连接字符串258

327、使用longjmp和setjmp函数进行出错恢复259

328、复制字符串260

329、大小写转换函数不能用于所有的欧洲式字符上261

330、应小心使用大写的欧洲文本261

331、用strchr函数来标记“,”分隔符262

332、用strtol和strtod函数分析列表中的字段263

333、删除一个字符串中最后一个字符265

334、scanf中的参数必须是地址266

335、用scanf查找字符集266

336、scanf抑制赋值运算符267

337、恢复scanf中的错误267

338、避免用scanf函数直接从键盘读入268

339、用printf函数实现动态精度268

340、用printf函数实现动态对齐269

341、存取可变参数表270

342、传递可变参数给其它的函数271

343、传递可变参数给printf272

第十二章 C+++I/O流库275

344、尽量使用输入输出流,少用printf和scanf276

345、理解流276

346、读输入之前先刷新输出277

347、使用流操作函数278

348、为十六进制数设置大写字符278

349、指定一个字段的宽度279

350、居左、右、中间对齐280

351、显示十六进制或八进制的基281

352、使点(.)前导281

353、调节十六进制数以适合字长282

354、设置浮点数精度的格式282

355、使用ios类公共成员函数283

357、使用带内部缓冲的ostrstream284

356、写入存储缓冲器284

358、用ostrstream写图形用户接口285

359、写自己的操纵算子285

360、写一个带整型或长整型的操纵算子286

361、写带非整型参数的操纵算子287

362、定义一个复杂类型的操纵算子288

363、写一个带多个参数的操纵算子288

364、重载<<运算符去流一个类290

365、提取值时处理分隔符291

366、在分析时使用seekg和tellg函数291

367、二进制文件上的流294

368、流类对象294

370、用get函数读取定界符297

369、查看档案类297

371、重定义cin和cout298

第三部分 MS-DOS说明301

第十三章 分段式体系结构301

372、了解Intel的分段式体系结构302

373、何时使用32位的编译器302

374、选择16位的存储器模式303

375、对Near,Far和Huge地址变换器使用宏304

376、用经过优化的Smaller模式来建立应用程序304

377、当使用Medium和Large模式时,说明局部函数为静态Near304

378、定义一些数据项为Far,从而使得可以保留在一种存储器模式中305

380、把V表移入代码段,以便程序保留在Medium模式中306

381、匹配存储器模式和函数库306

379、使用Huge指针306

382、建立适合任何模式的库307

383、连接标准库和混合模式应用程序307

384、如果需要指定Far指针,则对引用也须如此308

385、把同类函数组合在一个段内以优化存储管理308

第十四章目录312

386、显示DOS目录中的文件312

387、列目录时将日期和时间同时列出312

388、找出目录中的特殊文件和子目录314

389、将目录排序315

390、chdir函数不改变DOS驱动器316

391、搜索环境路径字符串317

393、文件说明缓冲器最长为120个字符318

392、目录名可以有后缀318

394、如果你要保存文件路径指定,使用从堆里分配的内存319

第十五章 调试321

395、检查未赋值的返回值322

396、检查复杂的函数参数322

397、使用调试程序测试各个字程序323

398、Windows函数的参数是自左向右入栈的324

399、尽可能在一个保护模式的操作系统下开发应用程序324

400、不学习Windows程序设计而在Windows下进行开发324

401、中断Windows程序325

402、中断后不要在系统程序中单步执行325

403、在库函数出错时找到调用点325

404、如果重复删除一个对象将会出现什么326

405、不要攻击编译程序作者326

1995《最优C/C++编程秘诀》由于是年代较久的资料都绝版了,几乎不可能购买到实物。如果大家为了学习确实需要,可向博主求助其电子版PDF文件(由(美)Anthony Porter著;秦冬雷等译 1995 北京:电子工业出版社 出版的版本) 。对合法合规的求助,我会当即受理并将下载地址发送给你。

高度相关资料

汤姆·斯旺C++编程秘诀(1994 PDF版)
汤姆·斯旺C++编程秘诀
1994 北京:电子工业出版社
BORLAND C++BUILDER编程( PDF版)
BORLAND C++BUILDER编程
最新Quick C、Microsoft C高级编程指南  下(1991 PDF版)
最新Quick C、Microsoft C高级编程指南 下
1991
C/C++程序员Java编程( PDF版)
C/C++程序员Java编程
北京市:清华大学出版社
C语言最新编程技巧200例( PDF版)
C语言最新编程技巧200例
C&C++程序设计( PDF版)
C&C++程序设计
经进东坡文集事略  上( PDF版)
经进东坡文集事略 上
文学古籍刊行社
C程序设计奥秘(1998 PDF版)
C程序设计奥秘
1998 昆明市:云南科学技术出版社
最新C++应用编程技术(1997 PDF版)
最新C++应用编程技术
1997 北京:国防工业出版社
编程精粹 Microsoft编写优质无错C程序秘诀 Microsoft techniques for developing bug-free C programs(1993 PDF版)
编程精粹 Microsoft编写优质无错C程序秘诀 Microsoft techniques for developing bug-free C programs
1993 北京:电子工业出版社
Windows95实用编程技术C/C++(1996 PDF版)
Windows95实用编程技术C/C++
1996 成都:四川大学出版社
C++成功使用秘诀(1996 PDF版)
C++成功使用秘诀
1996 北京:电子工业出版社
深入C++编程(1994 PDF版)
深入C++编程
1994 北京:北京航空航天大学出版社
C/C++程序员Java编程(1996 PDF版)
C/C++程序员Java编程
1996 北京:清华大学出版社
C语言最新编程技巧200例(1995 PDF版)
C语言最新编程技巧200例
1995 北京:电子工业出版社