在纸上浏览c++代码,你会怎么做?
Walking through C++ code on paper, how would you do it?
在我的编程课上,我们有基于代码示例的测试和测验,我们必须遍历并确定最终输出。通常它们都是一些棘手的代码片段,当我意识到的时候,我被困在一些随机的函数中,不知道我在做什么。
你如何正确地运行纸上的代码?跟踪循环、变量、函数等等,这让我很困惑。
举个例子,这是我们过去做的一个小测验,我得到了100%的分数,但它花了我很长时间,而且非常混乱:
#include <iostream>
#include <cstring>
using namespace std;
class foo {
char word[20];
int qty;
public:
foo( ) { set(3, 5); }
foo( int m, const char * s) { set(m, m+1);
strcpy(word, s); }
foo( const foo& a ) { cout << "... hahaha.1" << endl;
qty = 3 + a.qty;
strcpy( word, a.word );
strcat( word, ".5.6.7" );
cout << "... hahah.2" << endl; }
~foo( ) { cout << qty << "," << word << "!!!" << endl; }
void set(int a, int b){ qty = a + b;
strcpy( word, "summer" ); }
void wow();
void output(){ cout << word << "," << qty << endl; }
};
void hello( foo& );
void greet( foo );
int main() {
foo x, y(100, "QUIZ");
greet( y );
cout << "a.b.c.d.e." << endl;
hello( x );
x.output();
y.output();
cout << "...the end" << endl;
return 0;
}
void foo::wow() { strcat(word,".1.2.3");
qty += 4; }
void greet( foo g ) { cout << "...HI.1n";
g.wow();
g.output();
cout << "...HI.2n"; }
void hello(foo & h) { cout << "...hello.1" << endl;
foo e;
e = h;
h.wow();
h.output();
e.output();
cout << "...hello.2n"; }
实践是理解代码的最好方法。当我试着做这样的练习时,我并不是一开始就试图理解所有的函数。我从main开始,像调试器一样逐行检查所有变量。如果某件事让你感到困惑,就把所有的变量都写在纸上,并标记它们的每一个变化。然而,没有比训练更好更快地学习阅读和理解代码的方法了。
"像电脑一样思考"
你有一个程序和该程序正在使用的数据。
你需要知道你在程序中的位置。这确实需要一个堆栈,因为当你调用一个方法时,你必须知道当方法结束时返回到哪里。
你需要跟踪每个变量——当然变量对于方法调用来说可能是局部的,所以这些实际上也是一个堆栈,这就是你必须非常小心地确保你正在更改局部变量的正确实例的地方。全局变量很简单,因为只有一个副本,所以你可以把它们放在堆栈中,但只能放在堆栈的底部。
要在纸上工作,最简单的方法是将堆栈的底部放在页面的顶部,然后向下扩展堆栈。请记住,当方法返回时,它的局部变量将不再存在,因此请将它们擦掉或以某种方式标记在堆栈顶部。
相关文章:
- Mingw-64 在构建和安装后不会编译 openCV 代码
- 根据 GetLastError 直接写入磁盘会导致错误代码 5
- C++ 如果在 if 为 true 之后运行,为什么还会这样做
- 我该怎么做才能摆脱使用命名空间时的语法错误?
- 模板类是这里的最佳选择吗?如果是,我该怎么做?
- 为什么或在什么情况下,你会将参数作为C++中的引用(或指针)传递给函数?
- 在C++中,创建'n'数量的对象的推荐方法是什么,其中n是用户定义的。我该怎么做?
- >操作员在比较两个C++容器时会怎么做?
- 为什么 arr[i++] 与 arr[i]++ 会这样做?
- 为什么在同一条件变量上使用多个互斥锁会使此代码崩溃?
- 对我的 c++ 金字塔分配进行小调整?我应该怎么做?
- 将指向矢量的指针推回,然后修改其值会影响推送的值.我应该怎么做?
- 如果 strlen 在 char 数组之间遇到空格,它会怎么做
- 如果输入图像矩阵实际上是复杂类型,MATLAB imresize() 会怎么做?
- 我想在我的main中为下面的代码创建一个对象..那么我该怎么做呢
- C++当我们创建对象时,构造函数会初始化,但是如果我想再次重新初始化对象,请在 main 的某个时候说该怎么做
- 我把矢量从一个文本文件中归档,它不会变成一行.我该怎么做
- 我有两个类似的类.你会使用什么设计来分解代码
- LLVM clang编译器优化器以一种非常奇怪的方式重新排列代码,该怎么做
- 在纸上浏览c++代码,你会怎么做?