- 论坛徽章:
- 2
|
回复 1# L_kernel
无论是好是坏…… C语言已经成这个样子了……
趁着首页还在, 还是正经回复一下吧……
同一个名字/标识符,可以指代不同的东西 —— 无论是否应该这样编写代码 —— 这个应该是蛮常见的。比如:
- void f(void)
- {
- /* ^ */ /* ^ */
- int x,y; /* | */ /* | */
- /* A */ /* */
- /* | */ /* */
- /* v */ /* */
- { /* ^ */ /* */
- double x,z; /* | */ /* */
- /* B */ /* C */
- /* | */ /* */
- } /* v */ /* */
- /* ^ */ /* */
- /* | */ /* */
- /* A */ /* */
- /* | */ /* | */
- /* v */ /* v */
- }
复制代码 在C范围内, y 指代那个 int 变量。
在(两个)A范围内, x 指代那个 int 变量
而中间的B范围内, x 指代那个double变量。 z指代另一个double变量。
这是通过名字出现的位置决定名字指代物。
而 struct x x; 是另一种情况。
是通过名字的种类/作用决定名字的指代物。
- struct /* 有了 struct "前缀" 后续的 */
- x /* 就是指一个 tag 而不是别的东西 */
- /* 之后的 */
- x /* 就是一个普通标识符 */
- ; /* 两者不会冲突 */
- x : /* x 指 label 同样不会冲突 */
复制代码 PS:
对 lable 是函数作用域而不是块作用域感到惊讶的同学,可以问问使用js的同学是什么感受……
对 C语言区分ordinary/member/tag/label 感到惊讶的同学,可以参考lisp-1与lisp-2之间争论。 |
|