zerglurker007——代码执行的顺序

软件开发中,代码有三种基本执行顺序:

顺序执行 代码从入口开始一条一条执行,直到返回或者结束

循环执行 在设定条件后,代码重复执行某一个或多个部分,直到达到某些条件后终止

条件执行 代码会先判断某些条件,如果满足则执行部分代码,如果不满足则执行另一部分代码

实际当中,这三种执行顺序是交错出现的。你中有我,我中有你。

下面是上节课的代码,我们来一句一句的分析看,你就会明白我上面说的是什么了:

#include <stdio.h>
#include "public.h"

int main(int argc, char* argv[], char* env[])
{
	Fibonacci(10);
	return 0;
}

void Fibonacci(unsigned int nTotal)
{
	int nFirst = 1;
	int nSecond = 1,nThird;
	unsigned int i;
	if (nTotal == 0){
		return;//如果用户要求输出的数量为0,则什么都不输出
	}
	printf("%d\n", nFirst);
	if (nTotal == 1)
	{//如果用户要求输出的数量为1,则到此为止
		return;
	}
	//先把头两个数输出出来
	printf("%d\n",nSecond);
	if (nTotal <= 2)//如果用户指定输出数量不超过2个,则到此为止
		return;
	for (i = 2; i < nTotal;i++)
	{
		nThird = nFirst + nSecond;
		printf("%d\n", nThird);
		nFirst = nSecond;
		nSecond = nThird;
	}
}

首先是main函数,整个代码的4-8行

这是一段典型的顺序执行代码。从函数入口开始,一步一步执行。

顺序执行的代码逻辑比较清晰,没有什么歧义。

然后是比较复杂的Fibonacci函数(10-34行)

12-14行是明显的顺序执行。主要是声明并初始化变量。

15-17行就是一个典型的条件执行顺序。只有当nTotal为0的时候才会执行大括号里面的代码,否则直接跳过

注意=号表示赋值,而==表示逻辑等判断。然而C/C++中一个比较坑爹的设定是,即使是赋值表达式,也是有返回值的。

比如:nFirst=1这个表达式

如果你这么判断

if(nFirst=1){

printf("done!\n");

}

那么很好,那条输出函数printf("done!\n");将总是被执行。因为赋值表达式的值,总是和它被赋的值相等

也就是nFirst=0这个表达的值永远等于0

所以当你是要进行nFirst是否等于1的条件判断时,一定要用==而不是=

另外 表达式的含义是没有; 有;的是语句

if这个逻辑判断关键字后面的小括号,只能写入表达式,不能写入语句

但是请注意27-33行这个循环模块

for后面的括号里面是有两个语句和一个表达式。

和你看到的不一样(i = 2; i < nTotal;i++),这三条中,只有第一条i = 2和最后一条i++是语句,中间那条是表达式

这个语法特征是for关键字独有的,别无分号。

当然,你可以把代码写成这样:

        for (i = 2;
		i < nTotal;
		i++)
	{
		nThird = nFirst + nSecond;
		printf("%d\n", nThird);
		nFirst = nSecond;
		nSecond = nThird;
	}

我们实际调试一下,看看代码会如何执行

具体操作如下:

选中上面代码的第一行,然后选择 调试-新建断点-在函数处中断 如下图:

当然,也可以在代码行号前面单机鼠标左键

或者选中行之后,按下Ctrl+B按键来建立断点

断点建立好之后,按下F5来启动调试。注意是F5不是Ctrl+F5

一切顺利的话,你就会看到如下内容:

黄色箭头表示现在程序将要执行的代码行

这个时候你可以按下F10来一条一条执行代码

然后你可以观察for语句中的代码是如何执行的

如果你想释放调试,只需要在设置断点的行,点击红色的点清除断点,然后按下F5键即可

不过现在你可以先单步看看,代码在for模块中是如何执行的

没有意外的话,你会发现i=2这条,只执行了一次;而i++则从第二次循环才开始执行;i<nTotal则每次都执行

在调试过程中,如果你的鼠标停止在某个变量上面,则会显示变量当前的值

通过这个方式你可以观察i是如何变化的

好了,代码的三种执行顺序已经讲完了

各位可以好好练习一下调试代码,以后这个技能会伴随你的整个开发生涯

时间: 2024-08-10 13:57:05

zerglurker007——代码执行的顺序的相关文章

discuz 3.2 discuz_application.php代码执行逻辑顺序分析

discuz 3.2 discuz_application.php代码执行逻辑顺序分析 说明 步骤1.   discuz_application文件中定义了_init_env(),在此方法中定义了超级全局变量$_G(global $_G) 步骤2.   discuz_application的构造函数中初始化了_init_env()方法 步骤3.   实例化discuz_application 步骤4.   在forum_index.php文件中使用,discuz_application中定义的方

Java类的静态成员、静态代码块、普通成员、普通代码块、构造方法初始化执行的顺序

今天阅读<Java编程思想(第4版中文版)>,刚复习到类中成员的初始化这一知识点.为了加深印象和给其他人一点参考,参考书中示例并加以修改得到以下代码: 文件名:HelloWorld.java 包名:main package main; class Bowl { Bowl(int marker){ System.out.println("Bowl("+marker+")"); } void f1(int marker){ System.out.printl

当C#中带有return的TryCatch代码遇到Finally时代码执行顺序

编写的代码最怕出现的情况是运行中有错误出现,但是无法定位错误代码位置.综合<C#4.0图解教程>,总结如下: TryCatchFinally用到的最多的是TryCatch,Catch可以把Try代码块的错误捕捉到,并对错误进行后续处理.这一点比较常见. 现在要讨论的是如果Try和Catch代码块有return时代码的执行顺序.众所周知,return的作用是退出当前函数,不执行return后面的代码.那么问题来了:如果return出现在Try或catch代码块中,并且return后面还有代码,则

final、static、代码块、静态代码块、内部类、代码执行顺序

final final域使得确保初始化安全性(initialization safety)成为可能,初始化安全性让不可变形对象不需要同步就能自由地被访问和共享 作用在类上               则为final类,final类不能被继承.一般用于工具类时,同时把工具类构造函数声明为私有,暴露静态共有方法 作用在成员变量上    则视为常量.此时赋值方式有三种:(1)声明时赋值(2)构造函数中赋值(3)代码块中赋值. 即不管哪种方式都要保证在使用该变量之前要确保已经有值.使用该特性,可以强制赋

javascript--函数的声明及调用/JS中代码执行顺序

[函数的声明及调用] 1.函数声明格式: function 函数名(参数1,参数2,参数3--){ //函数体 return 结果: } 函数调用的格式: 函数名(参数1的值,参数2的值,--): 事件调用:事件名=函数名(): 2.函数声明的几点强调: ① 函数的声明,必须符合小驼峰法则(首字母小写,之后每个单词首字母大写): ② 参数的列表,可以有参数,可以无参数.分别称为有参函数,无参函数: ③ 声明函数时的参数列表,称为"形参列表"(变量的名): 调用函数时的参数列表,称为&q

python 多进程的启动和代码执行顺序

对照着廖雪峰的网站学习Python遇到些问题: 在进程中,父进程创建子进程时发现,显示不是按照顺序显示,疑问? 参照代码如下: 1 from multiprocessing import Pool 2 import os, time, random 3 4 def long_time_task(name): 5 print 'Run task %s (%s)...' % (name, os.getpid()) 6 start = time.time() 7 time.sleep(random.r

浏览器环境下JavaScript脚本加载与执行探析之代码执行顺序

本文主要基于向HTML页面引入JavaScript的几种方式,分析HTML中JavaScript脚本的执行顺序问题 1. 关于JavaScript脚本执行的阻塞性 JavaScript在浏览器中被解析和执行时具有阻塞的特性,也就是说,当JavaScript代码执行时,页面的解析.渲染以及其他资源的下载都要停下来等待脚本执行完毕①.这一点是没有争议的,并且在所有浏览器中的行为都是一致的,原因也不难理解:浏览器需要一个稳定的DOM结构,而JavaScript可能会修改DOM(改变DOM结构或修改某个

jsp页面中的代码执行加载顺序介绍(转)

原文出处:http://www.3lian.com/edu/2014/01-10/123053.html 本篇文章主要是对jsp页面中的代码执行加载顺序进行了详细的介绍,需要的朋友可以过来参考下,希望对大家有所帮助 1. java是在服务器端运行的代码,jsp在服务器的servlet里运行,而javascript和html都是在浏览器端运行的代码.所以加载执行顺序是是java>jsp>js. 2. js在jsp中的加载顺序 页面上的js代码时html代码的一部分,所以页面加载的时候是由上而下加

java复习基础篇——代码执行顺序

代码块:在Java中,使用{}括起来的代码成为代码块 根据其位置和声明的不同,可以分为局部代码块:局部位置,用于限定变量的生命周期 构造代码块:在类中的成员位置,用{}括起来的代码.每次调用构造方法执行前,都会先执行构造代码块. 作用:可以把多个构造方法的共同代码放在一起. 静态代码块:在类中的成员位置,用{}括起来的代码,只不过它用static修饰 作用:一般是对类进行初始化 public class BlockTest { { System.out.println("444 BlockTes