【发布时间】:2014-04-07 09:42:09
【问题描述】:
#include<stdio.h>
int main()
{
int i = 10;
printf("0 i %d %p\n",i,&i);
if (i == 10)
goto f;
{
int i = 20;
printf("1 i %d\n",i);
}
{
int i = 30;
f:
printf("2 i %d %p\n",i,&i); //statement X
}
return 0;
}
输出:
[test]$ ./a.out
0 i 10 0xbfbeaea8
2 i 134513744 0xbfbeaea4
我很难理解语句 X 的工作原理?如您所见,它是垃圾。应该说我没有声明??
【问题讨论】:
-
不应该打印
2 i 10 0xbfbeaea8来代替它正在打印的内容吗? :O -
不,因为
printf()中的i与顶部设置为10的i不同,因为他已经(ab)使用块来定义另一个i与printf()相同的块范围,但那个i尚未初始化。 -
@Emmet 但是,未初始化的
i也没有定义。不是吗??由于goto跳转跳过了定义语句??而之前的i在外部范围内,即也存在于内部块中.. 不应该是这样吗? :// -
不,它不是定义的,而是声明的,所以它在范围内并且可以使用。范围不是你到达某个地方的控制路径的函数,只是语法。
标签: c goto variable-declaration