《Programming: Principles and Practice Using C++》读书笔记(一)
2014-03-11 12:14
267 查看
c++之父Bjarne Stroustrup写给初学者的读本,语法和语言特性是次要,如他所言“思想和原理”才是重点
Bjarne Stroustrup这么说过:
“每一种程序设计语言代表了一种思想,将其中很多语言特性结合起来我们就能写出有用的程序,计算机不是一种只能完成固定任务的设备,他能完成我们能想想到的任何计算任务,将其与其他设备结合,理论上我们可以用它来完成任何任务”
c++语言构成:
面向过程的程序设计,传统的c程序设计
基于对象的程序设计
面向对象的程序设计
泛型编程
进阶方向:
从语言角度
算法角度
网络与操作系统角度
GUI方面
富有挑战性的应用——机器学习、游戏等
学习计算机科学的通用之法:
“先勇猛向前,偶尔摔一跤,获得编程的感觉,再慢下来,获得精确的控制和准确的理解必须在走之前就学会跑”
“略过一些细节,偶尔因缺少相关只是而被灼伤,是学习编程知识最快的途径”
“重点在思想、原理,不求甚解的学习大量语言规则和特性是错误之源”
目标代码+链接器=可执行程序
由此引出的三类程序错误:
编译错误
链接错误
运行时错误
使用IDE的用户往往忽略这个过程,但目标代码和可执行程序的是不具有移植性的
总是保证变量被初始化才安全,否则引用未初始化的变量将显示一个随机的垃圾值(因为int a;在定义变量时分配了存储空间,未初始化就引用必然输出内存中的垃圾值)
关于变量的命名:不允许使用关键字,但使用标准库中的名字,如string是可以的,当然不推荐这么做
注意隐式的类型转换,如sqrt(a),<math.h>中的操作数都是针对double型的,c/c++作为一种弱类型语言,其类型转换显得尤为重要
关于EOF(end of file):win中为Ctr+z,linux中为Ctr+d
封装、分治等在代码结构和质量方面作出的努力可以大大简化编程中最让人抓狂的部分:调试(尝试基于语法分析实现一下计算器程序真的对此体会颇深)
“如果一心想构建能长久留存的东西,那么一开始就要对代码组织和结构投入更多关注,而不是在发生错误之后再回过头来关注这方面”
表达式:左值=右值
关于程序可读性:好的代码是能够自我表述的,可读性的目的除了便于自己和他人理解外,更重要的目的是便于更好的发现和改正错误
例如:使用#define、const常量来避免“魔数”;尽量使用a*=b;不要在for语句的循环体中修改循环控制变量的值(遵循最常用的方式才是好的编程风格)
switch()对象只能是整型、字符型或枚举型,c#支持更多类型
为什么设计了函数:
实现复用、简化代码、分离计算逻辑、减少调试工作量
函数设计原则:
完成独立的逻辑单元,不宜过长
错误的来源:
缺少规划:没有事先规划好程序需要做什么,清理所有死角,必然会引起疏漏
不完备的程序:仍有一些边界问题未被考虑到
逻辑错误:程序实现上存在错误
意外:不存在永远正确的程序
避免错误:
精心组织软件结构,减少错误的发生
通过调试、测试消除大部分错误
确定余下的错误的不那么重要的
检查函数参数错误:
让函数调用者来处理异常参数
让被调用函数来处理异常参数(推荐,即前置参数检查)
如:area(int x) if(x<=0) throw runtime_error("none positive x")
异常处理的基本思想:将错误检查(被调用函数中)和错误处理(主函数中)分离
常见的错误:
范围错误(边界错误、偏一位错误):频率灰常高的一类
逻辑错误:很多时候是边界问题考虑不全面
慎重地定义每一个变量的初始值、慎重考虑一个变量的取值范围
低级错误:无厘头的代码书写错误,发现后常引发想砸电脑的冲动
善用估计:
“估计”是们优雅的艺术,通过快速的头脑风暴+常用的数学方法验证,找寻可能出现的错误和问题的死角
“很多科学家具备在一个信封的背面对十分复杂的问题作估计的能力和习惯“
从谷歌的面试题目看这项能力也确实重要
重视注释和前置条件:
”经验标明,编写注释和函数的前置条件可以显著提高程序质量:他强迫你思考函数的真正目的和需求时什么,从而避免程序设计上的许多错误”
除此之外,还可以适当地对函数加以后置条件的检查
(一)到此结束,(二)基于文法分析的简单计算器实现
Bjarne Stroustrup这么说过:
“每一种程序设计语言代表了一种思想,将其中很多语言特性结合起来我们就能写出有用的程序,计算机不是一种只能完成固定任务的设备,他能完成我们能想想到的任何计算任务,将其与其他设备结合,理论上我们可以用它来完成任何任务”
c++语言构成:
面向过程的程序设计,传统的c程序设计
基于对象的程序设计
面向对象的程序设计
泛型编程
进阶方向:
从语言角度
算法角度
网络与操作系统角度
GUI方面
富有挑战性的应用——机器学习、游戏等
学习计算机科学的通用之法:
“先勇猛向前,偶尔摔一跤,获得编程的感觉,再慢下来,获得精确的控制和准确的理解必须在走之前就学会跑”
“略过一些细节,偶尔因缺少相关只是而被灼伤,是学习编程知识最快的途径”
“重点在思想、原理,不求甚解的学习大量语言规则和特性是错误之源”
从编译、链接说起
源程序+编译器=目标代码目标代码+链接器=可执行程序
由此引出的三类程序错误:
编译错误
链接错误
运行时错误
使用IDE的用户往往忽略这个过程,但目标代码和可执行程序的是不具有移植性的
对象、类型、值
编译器会针对特定类型的对象在内存中开辟空间,存储其值,可以直接将对象理解为存储空间,对象通过变量来表示,变量只是一个名称,char* c的值是指针的地址,int a的值即是a的值总是保证变量被初始化才安全,否则引用未初始化的变量将显示一个随机的垃圾值(因为int a;在定义变量时分配了存储空间,未初始化就引用必然输出内存中的垃圾值)
关于变量的命名:不允许使用关键字,但使用标准库中的名字,如string是可以的,当然不推荐这么做
注意隐式的类型转换,如sqrt(a),<math.h>中的操作数都是针对double型的,c/c++作为一种弱类型语言,其类型转换显得尤为重要
关于EOF(end of file):win中为Ctr+z,linux中为Ctr+d
计算
计算的目标:正确、简单、高效封装、分治等在代码结构和质量方面作出的努力可以大大简化编程中最让人抓狂的部分:调试(尝试基于语法分析实现一下计算器程序真的对此体会颇深)
“如果一心想构建能长久留存的东西,那么一开始就要对代码组织和结构投入更多关注,而不是在发生错误之后再回过头来关注这方面”
表达式:左值=右值
关于程序可读性:好的代码是能够自我表述的,可读性的目的除了便于自己和他人理解外,更重要的目的是便于更好的发现和改正错误
例如:使用#define、const常量来避免“魔数”;尽量使用a*=b;不要在for语句的循环体中修改循环控制变量的值(遵循最常用的方式才是好的编程风格)
switch()对象只能是整型、字符型或枚举型,c#支持更多类型
为什么设计了函数:
实现复用、简化代码、分离计算逻辑、减少调试工作量
函数设计原则:
完成独立的逻辑单元,不宜过长
错误
“良好的代码应具备异常处理机制,理论上其应该可以应对任何异常输入”,边界问题太重要,谁做OJ谁知道错误的来源:
缺少规划:没有事先规划好程序需要做什么,清理所有死角,必然会引起疏漏
不完备的程序:仍有一些边界问题未被考虑到
逻辑错误:程序实现上存在错误
意外:不存在永远正确的程序
避免错误:
精心组织软件结构,减少错误的发生
通过调试、测试消除大部分错误
确定余下的错误的不那么重要的
检查函数参数错误:
让函数调用者来处理异常参数
让被调用函数来处理异常参数(推荐,即前置参数检查)
如:area(int x) if(x<=0) throw runtime_error("none positive x")
异常处理的基本思想:将错误检查(被调用函数中)和错误处理(主函数中)分离
常见的错误:
范围错误(边界错误、偏一位错误):频率灰常高的一类
逻辑错误:很多时候是边界问题考虑不全面
慎重地定义每一个变量的初始值、慎重考虑一个变量的取值范围
低级错误:无厘头的代码书写错误,发现后常引发想砸电脑的冲动
善用估计:
“估计”是们优雅的艺术,通过快速的头脑风暴+常用的数学方法验证,找寻可能出现的错误和问题的死角
“很多科学家具备在一个信封的背面对十分复杂的问题作估计的能力和习惯“
从谷歌的面试题目看这项能力也确实重要
重视注释和前置条件:
”经验标明,编写注释和函数的前置条件可以显著提高程序质量:他强迫你思考函数的真正目的和需求时什么,从而避免程序设计上的许多错误”
除此之外,还可以适当地对函数加以后置条件的检查
(一)到此结束,(二)基于文法分析的简单计算器实现
相关文章推荐
- Programming: Principles and Practice Using C++
- 时间序列 R 读书笔记 04 Forecasting: principles and practice
- 时间序列 R 读书笔记 04 Forecasting: principles and practice
- 时间序列 R 读书笔记 Forecasting: principles and practice 06 回归概述
- [Programming Visual C++]Chapter Six-Setting the Color for the Dialog Background and for Controls
- Improve the Design and Flexibility with Extreme Programming and TDD using NUnit
- Real-Time 3D Terrain Engines Using C++ and DirectX 9
- Hybrid application using QML and Qt C++
- [读书笔记]Applying UML and patterns:The agile manifesto and principles
- 《C++ Footprint and Performance Optimization》读书笔记
- Differences Between C++ Templates and C# Generics (C# Programming Guide)
- ALSA docs - Programming and Using Linux Sound - in depth
- 读书笔记之:Beej_s Network Programming Using Internet Sockets
- The C++ Programming Language 读书笔记 ch12(1)
- Using dllimport and dllexport in C++ Classes
- introduction to computation and programming using python
- 读书笔记:《The C++ programming Language》 第五章
- Real-Time C++: Efficient Object-Oriented and Template Microcontroller Programming.pdf
- How to show a modal dialog and modeless dialog using C++ - 如何用C++显示一个模态对话框和一个非模态对话框
- Types and Declarations(Chapter 4 of The C++ Programming Language)