1、当前编译器支持任何分支内定义同名变量,例如:
if ( 1 )
int n = 10 ;
endi
if ( 2 )
int n = 1 ;
endi
if ( 2 )
if (n1 > 3 )
int n = 11 ;
endi
else
if (n1)
n = 1 ;
int n = 90 ;
endi
ende
endi
if ( 1 )
int n = 10 ;
endi
if ( 2 )
int n = 1 ;
endi
if ( 2 )
if (n1 > 3 )
int n = 11 ;
endi
else
if (n1)
n = 1 ;
int n = 90 ;
endi
ende
endi
2、变量定义模型把代码中所有定义的变量看作是在一棵作用域树中,
(每个函数一个作用域树)树根为parent域为0的唯一节点,对应过
程最高层作用域;树根产生孩子,对应分支作用域。每个孩子又可
以有无限个孩子,对应分支内再产生的其它分支;每个孩子按照先
后顺序编号0,1,2,。。。如此类推。故上述代码可描述为以下
树结构:
(每个函数一个作用域树)树根为parent域为0的唯一节点,对应过
程最高层作用域;树根产生孩子,对应分支作用域。每个孩子又可
以有无限个孩子,对应分支内再产生的其它分支;每个孩子按照先
后顺序编号0,1,2,。。。如此类推。故上述代码可描述为以下
树结构:
level0: R0(n=10)
|
+-----------+-----------+
| | |
level1: c0(n=10) c1(n=1) c2()
|
+------+------+
| |
level2: c0(n=11) c1()
|
+
|
level3: c0(n=90)
|
+-----------+-----------+
| | |
level1: c0(n=10) c1(n=1) c2()
|
+------+------+
| |
level2: c0(n=11) c1()
|
+
|
level3: c0(n=90)
3、为区分每个变量,从定义变量的分支起,一直往树根扫描,并取扫过
节点的编号,组成一个过程体内唯一的编号序列,并加上变量名称来唯一
区分一个变量。故2中的各个变量可以作如下标示:
level0: n0
level1: n00 n01 n02
level2: n020
level3: n0120
level1: n00 n01 n02
level2: n020
level3: n0120
由于同一作用域内不允许变量重名,因此根据处在作用域树的不同位置
就可以唯一标识一个变量。
就可以唯一标识一个变量。