📄 00186.html
字号:
变量可以在序列或特性中使用。 </p><div class="Element170">
<a href="#" onclick="CopyElementToClipboard('code00654');">Copy Code</a></div>
<div class="Element13"><div class="Element12" id="code00654"><pre class="Element12"><span style="color: #0000FF">sequence</span> data_check<span style="color: #800080">;</span>
<span style="color: #0000FF">int</span> x<span style="color: #800080">;</span>
a <span style="color: #800080">##</span><span style="color: #FF0000">1</span> <span style="color: #800080">!</span>a<span style="color: #800080">,</span> x <span style="color: #800080">=</span> data_in <span style="color: #800080">##</span><span style="color: #FF0000">1</span> <span style="color: #800080">!</span>b[<span style="color: #800080">*</span><span style="color: #FF0000">0</span><span style="color: #800080">:</span><span style="color: #FF0000">$</span><span style="color: #800080">]</span> <span style="color: #800080">##</span><span style="color: #FF0000">1</span> b <span style="color: #800080">&& (</span>data_out <span style="color: #800080">== </span>x<span style="color: #800080">);</span>
<span style="color: #0000FF">endsequence</span>
<span style="color: #0000FF">property</span> data_check_p
<span style="color: #0000FF">int</span> x<span style="color: #800080">;</span>
a <span style="color: #800080">##</span><span style="color: #FF0000">1</span> <span style="color: #800080">!</span>a<span style="color: #800080">,</span> x <span style="color: #800080">=</span> data_in <span style="color: #800080">|=></span> <span style="color: #800080">!</span>b[<span style="color: #800080">*</span><span style="color: #FF0000">0</span><span style="color: #800080">:</span><span style="color: #FF0000">$</span><span style="color: #800080">]</span> <span style="color: #800080">##</span><span style="color: #FF0000">1</span> b <span style="color: #800080">&& (</span>data_out <span style="color: #800080">== </span>x<span style="color: #800080">);</span>
<span style="color: #0000FF">endproperty</span></pre></div></div>
<p class="Element10">
</p>
<p class="Element10">
局部变量可以在重复的序列上写入并实现值的累加。 </p><div class="Element170">
<a href="#" onclick="CopyElementToClipboard('code00655');">Copy Code</a></div>
<div class="Element13"><div class="Element12" id="code00655"><pre class="Element12"><span style="color: #0000FF">sequence</span> rep_v<span style="color: #800080">;</span>
<span style="color: #0000FF">int</span> x<span style="color: #800080">;</span>
<span style="color: #800080">`true,</span>x <span style="color: #800080">=</span> <span style="color: #FF0000">0 </span><span style="color: #800080">##</span><span style="color: #FF0000">0</span>
<span style="color: #800080">(!</span>a <span style="color: #800080">[*</span><span style="color: #FF0000">0</span><span style="color: #800080">:</span><span style="color: #FF0000">$</span><span style="color: #800080">] ##</span><span style="color: #FF0000">1</span><span style="color: #800080"> </span>a<span style="color: #800080">,</span> x <span style="color: #800080">=</span> x<span style="color: #800080">+</span>data<span style="color: #800080">)[*</span><span style="color: #FF0000">4</span><span style="color: #800080">]</span> <span style="color: #800080">##</span><span style="color: #FF0000">1</span> b <span style="color: #800080">##</span><span style="color: #FF0000">1</span> c <span style="color: #800080">&& (</span>data_out <span style="color: #800080">== </span>x<span style="color: #800080">);</span>
<span style="color: #0000FF">endsequence</span></pre></div></div>
<p class="Element10">
</p>
<p class="Element10">
局部变量在这个序列被实例化的序列中是不可见的。下面的例子演示了在序列<span class="Element146">seq1</span>中对子序列<span class="Element146">sub_seq1</span>中局部变量<span class="Element146">v1</span>的无效访问。 </p><div class="Element170">
<a href="#" onclick="CopyElementToClipboard('code00656');">Copy Code</a></div>
<div class="Element13"><div class="Element12" id="code00656"><pre class="Element12"><span style="color: #0000FF">sequence</span> sub_seq1<span style="color: #800080">;</span>
<span style="color: #0000FF">int</span> v1<span style="color: #800080">;</span>
a <span style="color: #800080">##</span><span style="color: #FF0000">1</span> <span style="color: #800080">!</span>a<span style="color: #800080">,</span> v1 <span style="color: #800080">=</span> data_in <span style="color: #800080">##</span><span style="color: #FF0000">1</span> <span style="color: #800080">!</span>b[<span style="color: #800080">*</span><span style="color: #FF0000">0</span><span style="color: #800080">:</span><span style="color: #FF0000">$</span><span style="color: #800080">]</span> <span style="color: #800080">##</span><span style="color: #FF0000">1</span> b <span style="color: #800080">&& (</span>data_out <span style="color: #800080">==</span> v1<span style="color: #800080">);</span>
<span style="color: #0000FF">endsequence</span>
<span style="color: #0000FF">sequence</span> seq1<span style="color: #800080">;</span>
c <span style="color: #800080">##</span><span style="color: #FF0000">1</span> sub_seq1 <span style="color: #800080">##</span><span style="color: #FF0000">1</span> <span style="color: #800080">(</span>do1 <span style="color: #800080">==</span> v1<span style="color: #800080">);</span> <span style="color: #008000">// 错误的,因为v1是不可见的。</span>
<span style="color: #0000FF">endsequence</span></pre></div></div>
<p class="Element10">
</p>
<p class="Element10">
为了访问一个子序列的局部变量,必须声明一个局部变量并通过一个自变量传递到被实例化的子序列。下面的例子演示了这样的用法。 </p><div class="Element170">
<a href="#" onclick="CopyElementToClipboard('code00657');">Copy Code</a></div>
<div class="Element13"><div class="Element12" id="code00657"><pre class="Element12"><span style="color: #0000FF">sequence</span> sub_seq2<span style="color: #800080">(</span>lv<span style="color: #800080">);</span>
a <span style="color: #800080">##</span><span style="color: #FF0000">1</span> <span style="color: #800080">!</span>a<span style="color: #800080">,</span> v1 <span style="color: #800080">=</span> data_in <span style="color: #800080">##</span><span style="color: #FF0000">1</span> <span style="color: #800080">!</span>b[<span style="color: #800080">*</span><span style="color: #FF0000">0</span><span style="color: #800080">:</span><span style="color: #FF0000">$</span><span style="color: #800080">]</span> <span style="color: #800080">##</span><span style="color: #FF0000">1</span> b <span style="color: #800080">&& (</span>data_out <span style="color: #800080">==</span> lv<span style="color: #800080">);</span>
<span style="color: #0000FF">endsequence</span>
<span style="color: #0000FF">sequence</span> seq2<span style="color: #800080">;</span>
<span style="color: #0000FF">int</span> v1<span style="color: #800080">;</span>
c <span style="color: #800080">##</span><span style="color: #FF0000">1</span> sub_seq2<span style="color: #800080">(</span>v1<span style="color: #800080">)</span> <span style="color: #800080">##</span><span style="color: #FF0000">1</span> <span style="color: #800080">(</span>do1 <span style="color: #800080">==</span> v1<span style="color: #800080">);</span> <span style="color: #008000">// 现在v1被绑定到lv</span>
<span style="color: #0000FF">endsequence</span></pre></div></div>
<p class="Element10">
</p>
<p class="Element10">
局部变量可以被传递到一个应用了ended的命名序列的实例,并且以相似的方式访问。例如: </p><div class="Element170">
<a href="#" onclick="CopyElementToClipboard('code00658');">Copy Code</a></div>
<div class="Element13"><div class="Element12" id="code00658"><pre class="Element12"><span style="color: #0000FF">sequence</span> seq2a<span style="color: #0000FF">;</span>
<span style="color: #0000FF">int</span> v1<span style="color: #800080">;</span>
c <span style="color: #800080">##</span><span style="color: #FF0000">1</span> sub_seq2<span style="color: #800080">(</span>v1<span style="color: #800080">).</span><span style="color: #0000FF">ended</span> <span style="color: #800080">##</span><span style="color: #FF0000">1</span> <span style="color: #800080">(</span>do1 <span style="color: #800080">==</span> v1<span style="color: #800080">);</span> <span style="color: #008000">// 现在v1被绑定到lv</span>
<span style="color: #0000FF">endsequence</span></pre></div></div>
<p class="Element10">
</p>
<p class="Element10">
当将局部变量可以被传递到一个应用了<span style="color: #0000FF">ended</span>的命名序列的实例的时候存在一些限制:
<ol class="Element631">
<li value="1" class="Element601">局部变量只能以完整的实型参数传递,而不能作为实型参数的正确子表达式传递。</li>
<li value="2" class="Element601">在命名序列的声明中,局部变量被绑定的形式参数不能在它被赋值之前引用。</li>
</ol> </p>
<p class="Element10">
<span class="Element146">sub_seq2</span>符合第二条限制,因为<span class="Element146">v1 <span style="color: #800080">=</span> data_in</span>的赋值发生在<span class="Element146">data_out <span style="color: #800080">==</span> lv</span>中对<span class="Element146">lv</span>的引用之前。 </p>
<p class="Element10">
</p>
<p class="Element10">
如果一个局部变量在被传递到一个应用了<span style="color: #0000FF">ended</span>的命名序列的实例之前进行了赋值,那么上述的限制能够防止所赋的值在命名序列内部可见。这些限制是重要的,因为<span style="color: #0000FF">ended</span>的使用意味着局部变量在命名序列外部被赋值的时间点与实例匹配的起始点没有能够得到保证的关系。 </p>
<p class="Element10">
</p>
<p class="Element10">
如果下面两个条件被满足,一个作为实形参数被传递到一个应用了<span style="color: #0000FF">ended</span>的命名序列的实例的局部变量将会从<span style="color: #0000FF">ended</span>的应用中流出到该实例:
<ol class="Element631">
<li value="1" class="Element601">局部变量流出命名序列实例的结尾,如序列的局部变量流规则所定义的那样。(参见下面的描述以及<a href="00886.html" target="topic">附录H</a>。)</li>
<li value="2" class="Element601">作用到该实例的<span style="color: #0000FF">ended</span>的应用是一个最大的布尔表达式。换句话说,<span style="color: #0000FF">ended</span>的应用上不能有非或任何其它表达式操作符。</li>
</ol>上述的两个条件均被<span class="Element146">sub_seq2</span>和<span class="Element146">seq2a</span>所满足。因此,<span class="Element146">seq2a</span>中比较表达式<span class="Element146">do1 <span style="color: #800080">==</span> v1</span>中<span class="Element146">v1</span>的值为<span class="Element146">sub_seq2</span>中通过赋值语句<span class="Element146">v1 <span style="color: #800080">=</span> data_in</span>赋给lv的值。 然而,对于下面的例子: </p><div class="Element170">
<a href="#" onclick="CopyElementToClipboard('code00659');">Copy Code</a></div>
<div class="Element13"><div class="Element12" id="code00659"><pre class="Element12"><span style="color: #0000FF">sequence</span> seq2b<span style="color: #800080">;</span>
<span style="color: #0000FF">int</span> v1<span style="color: #800080">;</span>
c <span style="color: #800080">##</span><span style="color: #FF0000">1</span> <span style="color: #800080">!</span>sub_seq2<span style="color: #800080">(</span>v1<span style="color: #800080">).</span><span style="color: #0000FF">ended</span> <span style="color: #800080">##</span><span style="color: #FF0000">1</span> <span style="color: #800080">(</span>do1 <span style="color: #800080">==</span> v1<span style="color: #800080">);</span> <span style="color: #008000">// v1 unassigned</span>
<span style="color: #0000FF">endsequence</span></pre></div></div>
<p class="Element10">
</p>
<p class="Element10">
上面的例子违背了第二个条件,因为“非”操作被应用到了<span class="Element146">sub_seq2<span style="color: #800080">(</span>v1<span style="color: #800080">).</span><span style="color: #0000FF">ended</span></span>。因此,<span class="Element146">v1</span>不会从<span style="color: #0000FF">ended</span>的应用中流出到这个实例,并在表达式<span class="Element146">do1 <span style="color: #800080">==</span> v1</span>中对<span class="Element146">v1</span>的引用是一个未赋值的变量。 </p>
<p class="Element10">
</p>
<p class="Element10">
在单个周期中,一个应用了<strong><span style="color: #0000FF">ended</span></strong>的序列实例可能具有多个匹配,并且这些匹配对本地变量可能具有不同的计算结果。在语义上,多个匹配按匹配一个<strong><span style="color: #0000FF">or</span></strong>操作的两个析取项相同的方式对待(参见下面的描述)。换句话说,计算应用了<strong><span style="color: #0000FF">ended</span></strong>的实例的线程将会产生分支以便单独地考虑这些局部变量。 </p>
<p class="Element10">
</p>
<p class="Element10">
注意:当一个局部变量是一个序列声明的形式参数的时候,按如下所示的方式声明变量是非法的。 </p><div class="Element170">
<a href="#" onclick="CopyElementToClipboard('code00660');">Copy Code</a></div>
<div class="Element13"><div class="Element12" id="code00660"><pre class="Element12"><span style="color: #0000FF">sequence</span> sub_seq3<span style="color: #800080">(</span>lv<span style="color: #800080">);</span>
<span style="color: #0000FF">int</span> lv<span style="color: #800080">;</span> // 因为lv是一个形式参数,所以该条声明是非法的。
a <span style="color: #800080">##</span><span style="color: #FF0000">1</span> <span style="color: #800080">!</span>a<span style="color: #800080">,</span> v1 <span style="color: #800080">=</span> data_in <span style="color: #800080">##</span><span style="color: #FF0000">1</span> <span style="color: #800080">!</span>b[<span style="color: #800080">*</span><span style="color: #FF0000">0</span><span style="color: #800080">:</span><span style="color: #FF0000">$</span><span style="color: #800080">]</span> <span style="color: #800080">##</span><span style="color: #FF0000">1</span> b <span style="color: #800080">&& (</span>data_out <span style="color: #800080">==</span> lv<span style="color: #800080">);</span>
<span style="color: #0000FF">endsequence</span></pre></div></div>
<p class="Element10">
</p>
<p class="Element10">
当在调用分支操作符<strong><span style="color: #0000FF">or</span></strong>、<strong><span style="color: #0000FF">and</span></strong>以及<strong><span style="color: #0000FF">intersect</span></strong>的序列中使用局部变量的时候,必须作出一些特别的考虑。从这些操作符的一个构建而来的复合序列的计算可以认为是产生两个分支线程来并行地计算操作书序列。在开始计算复合序列之前一个局部变量可能已经被赋了值。这样的一个局部变量被称为流入到每一个操作数序列。局部变量可以在一个或两个操作数序列中被赋值或解赋值。通常,我们不能保证两个线程的计算会产生一致的结果值,乃至对局部变量是否已经被赋了值具有一致的认识。因此,在复合序列的计算过程中或之前赋给局部变量的值并不总是被允许在复合序列的计算之后可见。 </p>
<p class="Element10">
</p>
<p class="Element10">
在某些情况下,在局部变量值上的不一致是无关紧要的,然而在有些情况下却是重要的。附录H给出了一些精确的条件来定义一些静态(也就是编译时可计算的)条件,在这些条件下能够保证局部变量的值在复合序列被计算后具有一致的视图。如果满足了这些条件,那么局部变量被称为流出了复合序列。局部变量流的一个直观描述如下:
<ol class="Element631">
<li value="1" class="Element601">在并行线程上赋值的变量不能在同属线程中访问。例如:</li>
</ol></p><div class="Element170">
<a href="#" onclick="CopyElementToClipboard('code00661');">Copy Code</a></div>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -