zerglurker的C语言教程007——代码运行的顺序
软件开发中。代码有三种基本运行顺序:
顺序运行 代码从入口開始一条一条运行。直到返回或者结束
循环运行 在设定条件后,代码反复运行某一个或多个部分,直到达到某些条件后终止
条件运行 代码会先推断某些条件,假设满足则运行部分代码,假设不满足则运行还有一部分代码
实际其中,这三种运行顺序是交错出现的。你中有我,我中有你。
以下是上节课的代码,我们来一句一句的分析看。你就会明确我上面说的是什么了:
#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这个逻辑推断keyword后面的小括号,仅仅能写入表达式,不能写入语句
可是请注意27-33行这个循环模块
for后面的括号中面是有两个语句和一个表达式。
和你看到的不一样(i = 2; i < nTotal;i++)。这三条中。仅仅有第一条i = 2和最后一条i++是语句,中间那条是表达式
这个语法特征是forkeyword独有的,别无分号。
当然。你能够把代码写成这样:
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是怎样变化的
好了,代码的三种运行顺序已经讲完了
各位能够好好练习一下调试代码,以后这个技能会伴随你的整个开发生涯
zerglurker的C语言教程007——代码运行的顺序的更多相关文章
- zerglurker的c语言教程006——第一功能
行,以往的经验教训后,.成员main性能.变数.命名等基本概念应该有一个初步的了解 下面,我们就可以开始我们自己的第一个定义的函数. 仿照头等舱.操作的第二个教训.添加一个新的项目的解决方案Lessi ...
- Swift3.0语言教程字符串与URL的数据转换与自由转换
Swift3.0语言教程字符串与URL的数据转换与自由转换 Swift3.0语言教程字符串与URL的数据转换 Swift3.0语言教程字符串与URL的数据转换与自由转换,字符串中的字符永久保存除了可以 ...
- YAML 语言教程(转载)
用YAML语言读取配置是最快的,之前的suricata中用yaml读取了配置,并且在代码运行期间,对配置进行了维护,所以抽点时间,来了解一下YAML语言编程,下文虽然对YAML语言和JAVAScrip ...
- Swift2.0语言教程之函数嵌套调用形式
Swift2.0语言教程之函数嵌套调用形式 Swift2.0语言函数嵌套调用形式 在Swift中,在函数中还能够调用函数,从而形成嵌套调用.嵌套调用的形式往往有两种:一种是在一个函数中调用其它函数:还 ...
- Swift2.0语言教程之类的嵌套与可选链接
Swift2.0语言教程之类的嵌套与可选链接 Swift2.0语言类的嵌套 在一个类中可以嵌套一个或者多个类.它们的嵌套形式也是不同的,大致分为了两种:直接嵌套和多次嵌套.下面依次讲解这两种方式. S ...
- Swift2.0语言教程之下标脚本
Swift2.0语言教程之下标脚本 下标脚本 下标脚本是访问对象.集合或者序列的快速方式.开发者不需要调用实例特定的赋值和访问方法,就可以直接访问所需要的数值.例如在数组中,可以直接使用下标去访问或者 ...
- Swift2.0语言教程之类的方法
Swift2.0语言教程之类的方法 Swift2.0语言的方法 方法其实就是函数,只不过它被定义在了类中.在Swift中,根据被使用的方式不同,方法分为了实例方法和类型方法两种.这两种方法的定义也和O ...
- Swift2.0语言教程之类的属性
Swift2.0语言教程之类的属性 类 虽然函数可以简化代码,但是当一个程序中出现成百上千的函数和变量时,代码还是会显得很混乱.为此,人们又引入了新的类型——类.它是人们构建代码所用的一种通用.灵活的 ...
- Swift2.0语言教程之闭包
Swift2.0语言教程之闭包 Swift2.0语言闭包 闭包是自包含的函数代码块,可以在代码中被传递和使用.Swift中的闭包与C和Objective-C中的代码块(blocks)以及其他一些编程语 ...
随机推荐
- 使用 Python 获取 Linux 系统信息
探索platform模块 platform模块在标准库中,它有很多运行我们获得众多系统信息的函数.让我们运行Python解释器来探索它们中的一些函数,那就从platform.uname()函数开始吧: ...
- oracle组合分区
由于Interval分区是针对range的,11g-12.1版本,目前只有Interval—*一共3种Interval的复合分区 range-list方法: partition by range (u ...
- 想象一下(imagine)
想象一下(imagine) 题目描述 我们高大的老班举起了有半个他那么高的三角板,说:"你们想象一下--" 于是你就陷入了想象-- 有一棵n个点的树,每个叶子节点上都有一个人,他们 ...
- 核苷酸(evolution)
核苷酸(evolution) 题目描述 生物课是帕特里克最讨厌的课程,没有之一. 相比做一些无聊而又无趣的遗传题,他更喜欢其他所有的科目. 包括英语. 但是今天不同.他被一个关于RNA感染DNA的题目 ...
- docker (centOS 7) 使用笔记5 - weave网络
weave官网 https://www.weave.works 1. 下载安装 sudo curl -L git.io/weave -o /usr/local/bin/weave sudo chmod ...
- OpenJudge 2727 仙岛求药
总时间限制: 1000ms 内存限制: 65536kB 描述 少年李逍遥的婶婶病了,王小虎介绍他去一趟仙灵岛,向仙女姐姐要仙丹救婶婶.叛逆但孝顺的李逍遥闯进了仙灵岛,克服了千险万难来到岛的中心,发 ...
- Mac air苹果笔记本安装Win10双系统教程(绝对能成功,超详细!)[转]
转自:http://www.xitonghe.com/jiaocheng/anzhuang-4676.html 在MAc苹果电脑,Mac air上安装Windows7相信大家都已经会了吧,好吧Win7 ...
- MySQL冗余数据的三种方案
一,为什么要冗余数据 互联网数据量很大的业务场景,往往数据库需要进行水平切分来降低单库数据量. 水平切分会有一个patition key,通过patition key的查询能够直接定位到库,但是非pa ...
- Java发送邮件--web.xml配置,Java代码配置
前言:我目前总结的使用java发送邮件的方式有两种,分别是在spring框架xml配置文件使用bean标签,另一种方法是把发送功能封装成一个对象,废话不多说上代码, 边看代码边讲解,希望对需要的人能有 ...
- ASP.NET MVC 实现 AJAX 跨域请求
ASP.NET MVC 实现AJAX跨域请求的两种方法 和大家分享下Ajax 跨域的经验,之前也找了好多资料,但是都不行,后来看到个可行的修改了并测试下 果然OK了 希望对大家有所帮助! 通常发送 ...