{
int i;
for(i=0;i<5;i++)
{
int i=10;
printf("%d",i);
}
}
我有两个问题
- 为什么没有重新声明错误
i
?
- 为什么输出会是
10
5次和没有10
1 time?
这一切都与scope的标识符。标识符只是 C 中赋予实体(对象、函数、typedef 名称等)的名称,并且根据C11 6.2.1 /1
:
相同的标识符可以在程序中的不同点表示不同的实体。
实体的范围描述于/2
该部分的:
对于标识符指定的每个不同实体,标识符仅在称为其范围的程序文本区域内可见(即可以使用)。
And /4
涵盖您的具体情况:
如果标识符在同一名称空间中指定两个不同的实体,则范围可能会重叠。如果是这样,一个实体的范围(内部范围)将严格先于另一实体(外部范围)的范围结束。
换句话说,类似:
{
int i = 42;
printf ("%d ", i);
{
int i = 17;
printf ("%d ", i);
}
printf ("%d\n", i);
}
完全有效,并将打印42 17 42
。这是因为标识符i
内部块的内部是在它的own范围,以第一个右大括号结束。
在您的特定情况下,您可以将其视为:
{
int i; \
for(i=0;i<5;i++) > outer i scope
{ /
int i=10; \
printf("%d",i); > inner i scope
} /
}
内在int i=10
有效隐藏外层i
在身体的持续时间内for
环形。这就是为什么它会打印很多10
s 而不是0..4
.
内部范围i
在右大括号处结束for
循环体使得,当继续条件for
检查循环,它再次看到外部i
。这就是为什么它循环五次而不是一次。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)