代码不同于普通文字,阅读时注意两方面:

  • 符号含义:相同符号,上下文不同时含义也不同,如*和&
  • 阅读顺序:不总是按从左往右顺序阅读的,有时要倒着读或者跳着读逻辑才通顺
  • 适当省略:有些内容虽然写了,但不需要读出来
  • 分清主次:类似课文每段有中心句,代码也分主要逻辑代码和次要逻辑代码

读代码和写代码是两个相反的过程,要求是一样的

  • 读代码:代码——逻辑——这段代码干了什么(输入)
  • 写代码:要实现什么功能——逻辑——代码(输出)

 

1、符号含义:

Student::Student(char *name, int age, float score): m_name(name), m_age(age), m_score(score){}

  • ::读作“的”,Student类的Student函数(类似“二班的小明”,其他班也可能有叫小明的)
  • ()读作“参数”,构造函数Student()有三个参数,分别是*name,age,score
  • *读作“指针”,表示参数是指针类型的
  • :读作“初始化”,后面的初始化语句以逗号隔开
  • ()读作“等于”,m_name=name
  • {}读作“函数体”,代表Student是个函数,函数体为空

一整句连起来读:

Widget::Widget(QWidget *parent):QWidget(parent),ui(new Ui::Widget){ui->setupUi(this)}

  • 创建Widget对象时执行以下内容:执行父类QWidget的构造函数,创建一个Ui::Widget类的对象ui,并执行Ui::Widget类的setupUi()函数

其他常见语句元素:

  • public:共有继承
  • explicit:显式
  • static:静态(隐藏)
  • <>:of
  • ->:的
  • =:如果前面是指针变量,读作“指向”

只有每个符号的含义明确了,才能流畅地阅读代码;同理,只有知道具体逻辑通过什么符号表达,才能流畅地写代码 

 

2、阅读顺序:

删除二分搜索树中最小节点的代码:

 1 Node* removeMin(Node* node){
 2     // 递归到底 
 3     if( node->left == NULL){ 
 4         Node* rightNode = node->right;
 5         delete node;
 6         count --;
 7         return rightNode;
 8     }
 9     node->left = removeMin(node->left);
10     return node;
11 } 
  • 函数定义:跳读,先读函数名(要干的事),再读参数,最后读返回值类型
  • 赋值语句:从右向左读,如int* A= B,把B赋值给A,A是一个整型指针变量
  • 判断语句:从左向右读
  • 函数调用:跳读,先读函数名(要干的事),再读参数,最后读把返回值赋给谁

按逻辑顺序读代码才不累,写代码也一样,是按逻辑顺序跳着写的,而不是像写文章一样顺着写的