有关计算机中基本算法的具体实现(加减乘除等)可参见《计算机程序设计艺术》一书。
VC6 IDE环境使用简介:
文件视图列出的是要编译的文件,类视图列出所有全局变量、类及函数。.dsp是工程文件,.dsw是工作空间,.ncb其他杂信息,.pdb调试符号信息。
VC6中的快捷键:
F7编译并链接工程,Ctrl+F7仅编译当前文件。F5调试运行,Ctrl+F5直接运行。F9设置或取消断点,Ctrl+F10断点到当前行,F10单步过,F11单步进,Shift+F11单步出。调试状态下,Ctrl+3调出监视窗口(可用运算符,不能使用函数),Ctrl+5调存器,Ctrl+6内存,Ctrl+7堆栈调用,Ctrl+8查看汇编代码。
多重循环中跳出可用goto。
switch机制分析:
情况1(case分支小于或等于3个),如图:
进调试看汇编代码见图:
以上图可知,此时编译器对switch的处理并未做优化,VC6的编译结果是把i值取出赋值到一个临时变量里,分别与值1、2、3做比较,如果等于则跳转到相应的处理代码,如果都没有跳转到default处,有点类似于下面的if-else:
if(1 == i) {
// case 1:
} else if(2 == i) {
// case 2:
} else if(3 == i) {
// case 3:
} else {
// default:
}
但switch与if-else最大不同是它所有的分支判断代码在一处,各分支执行代码又集中在另一处,一般的每个case中都应加上break以跳出流程,否则程序将顺序向下执行代码。
情况2(case分支大于3个且有基本连续值),如图:
其调试汇编代码如图:
很明显,此时编译器对switch已做了优化处理,具体流程先把i取出赋值到临时变量里,减去case的最小值(此例减-2=加2),这样该变量就是一个以0为起始的数组下标,接着判断一下此下标是否越界(大于6则跳转到default处)。这个例子里从-2到4,共有7项,其中-2、1、3、4有自己的处理代码,-1、0、2编译器自动链接到default处。上面讲的数组其实就是一个case分支地址表,每个表项都指向一个case分支地址,从小到大排列,上例中分支地址表在40F03Ch处,看一下其值:
完全应正了我们的推论。
情况3(case分支大于3个且值跳跃不连续)
对情况3的处理和情况1差不多,也是做判断跳转,但编译器会做一些优化,像大于小于如此,尽量使得判断次数最优最少。