目录
下面的两个源代码,希望实现的功能是传入一个参数0,通过三次循环,每次在循环体内加3,输出的结果赋值给一个数值显示控件。通过代码的结果,来看看隧道和移位寄存器到底有什么区别。
一、隧道
1、前面板创建一个数值显示控件
2、程序框图
(2.1)程序框图添加一个For循环,循环次数为3
(2.2)、程序框图For循环外面添加一个常数0,For循环内部添加一个加号和常数3
(2.3)加号连线到数值显示控件
哇!系统提示错误:已连接两个不同类型的接线端。
右键单击自动索引隧道
弹出下拉菜单,选择隧道模式为:最终值
哈,没有错误啦!
二、隧道运行结果
运行一下观察运行结果,显示控件显示3。
三、移位寄存器添加方法1(从隧道替换为移位寄存器)
参见下图,程序框图已经添加了隧道,如何将隧道替换为移位寄存器呢?
1、循环隧道替换为移位寄存器
2、FOR循环右边边框上的实心方块替换为移位寄存器
左边的实心方块会变成一个空心方块,方块内有一个向下的箭头。
鼠标也会变成一个空心方块,方块内有一个向上的箭头。
鼠标点击FOR循环右边边框上的实心方块(隧道)。
当鼠标点击FOR循环右边边框上的实心方块(隧道)后,FOR循环右边边框上的实心方块(隧道)变成移位寄存器(空心方块,方块内有一个向上的箭头)
四、移位寄存器方法1运行结果
运行一下观察运行结果,显示控件显示9。
五移位寄存器添加方法2(直接添加移位寄存器)
参见下图,程序框图中没有添加隧道,如何添加移位寄存器呢?
1、连线常数0和加法
2、FOR循环边框左边添加移位寄存器
鼠标点击FOR循环左边边框上的实心小方块
弹出下拉菜单,选择“替换为移位寄存器”
可以观察到FOR循环左边边框上的实心小方块变成空心小方块,小方块内有一个向下的箭头。FOR循环右边边框上自动添加了一个空心小方块,小方块内有一个向上的箭头。
3、连线加号到FOR循环右边边框上的空心小方块内的箭头。
4、连线FOR循环右边边框上的空心小方块内的箭头到最右边的数值显示控件。
六、移位寄存器方法2运行结果
运行一下观察运行结果,显示控件显示9。
七、切记:移位寄存器必定成对出现,否则程序会出现编译错误。
移位寄存器必定在FOR循环的左边边框上有一个,在FOR循环的右边边框上也要有一个。
八、分析
我们发现分别使用隧道和使用移位寄存器运行,得到的结果却迥然不同。隧道程序循环执行3次后输出的结果仍为3,而二次移位寄存器程序循环执行3次后如愿以偿的得到了9这个值,其原理在于:
(1)、隧道是一个局部变量值,每次进入循环体都会被循环体外部赋予一个初始值,所以即使循环执行了3次,但是每一次隧道的左入口的值都为0,在循环体内加3后,隧道的右出口值为3,即使执行N次也是这样。
(2)、移位寄存器的值稍微不同,每一次在循环体内执行,每次都会把右边移位寄存器出口的值用作左边入口的值,因此执行3次以后得到了9。
正如上文提到,熟悉C/C++的同学应该会想到了,这就是我们所熟悉的局部变量和静态局部变量的区别嘛!
是的,隧道相当于每次进来循环体之后把循环体外的值赋予循环体内的局部变量,所以不管循环体内执行几次,其结果也等同于只执行了一次。然而移位寄存器相当于加了static的静态局部变量,我们知道静态局部变量是不会压栈的,因此它的值会随着每次循环体的执行而往上累加。
总结:隧道就相当于C/C++中的循环体内的局部变量,移位寄存器就相当于C/C++中的循环体外的静态局部变量。