在下面的代码中,请指出不同的域。ix的哪些声明是错误的?为什么?
上面已经在后面的注释中指出了不同的域。需要注意的一些地方我用蓝色的线画了下。后面有编号。首先看编号为1的,这两个语句是位于全局域中。编号为2的需要注意的地方是func函数的参数所在的域和func函数的函数体的域是一样的。即都是在局部域的层次1中。也就是说函数的参数是属于该函数的函数体的第一个局部域。编号为3的需要注意的地方就是if语句中定义的变量(即在()中定义的变量)所属的域与if语句是同一个域。即在if()括号中定义的变量可以在if{}中使用,也可以在else{}中使用。
下面说明哪些ix的声明是不合法的:
(下面语句前的编号是语句在程序中的行号)
1、这样声明的ix是合法的。位于全局域中。
2、这样声明的ix函数是非法的,因为函数名ix在前面已经被使用了。在同一个域中,每一个符号名称都只能代表独一无二的实例。这也就告诉我们在同一个域中,函数的函数名和变量名是不能相同的。必须不一样。
4、这样声明的ix变量是合法的。位于函数func的第一个局部域中。即层次是1
6、这样声明的ix是非法的。因为该ix同样是位于函数func的第一个局部域中。即层次也是1。在func函数的参数列表中我们已经定义了ix,所以再定义ix是非法的。
7、这样声明的ix是合法的,因为该ix是位于函数func的第二个局部域中,即层次是2。
8、这样声明的ix是非法的,因为该ix的域和if()括号是位于同一个域中
11、这样声明的ix是合法的,因为该ix是位于一个if里面的一个语句块中,是函数func的第三个局部域,即层次是3
16、这样声明的ix是非法的,理由和8是一样的。
从上面的分析中,我们可以得出一个结论:
名字解析期间查找域的顺序是有内向外,所以在外围域中的声明被嵌套域中的同名声明所隐藏。比如说全局域中的ix和局域中的ix是不同的
143

被折叠的 条评论
为什么被折叠?



