【发布时间】:2015-07-05 00:37:51
【问题描述】:
我正在阅读 K.N.King 的 C Programming - A Modern Approach 以学习 C 编程语言,并注意到 goto 语句不能跳过可变长度数组声明。
但现在的问题是:为什么goto 跳转可以跳过定长数组声明和普通声明?更准确地说,根据 C99 标准,这些示例的行为是什么?当我测试这些案例时,似乎声明实际上没有被跳过,但这是正确的吗?声明可能被跳过的变量是否可以安全使用?
1.
goto later;
int a = 4;
later:
printf("%d", a);
2.
goto later;
int a;
later:
a = 4;
printf("%d", a);
3.
goto later;
int a[4];
a[0] = 1;
later:
a[1] = 2;
for(int i = 0; i < sizeof(a) / sizeof(a[0]); i++)
printf("%d\n", a[i]);
【问题讨论】:
-
@Mints97 啊,即使没有复合语句,if 语句也有自己的块?我认为这就是答案:) 太糟糕了,我不能接受 cmets
-
你这是什么意思? if 语句与此有什么关系?块和复合语句或多或少相同,IIRC
-
@Mints97 我的意思是有条件声明的变量不会移到整个函数的开头,而只是移到它们存在的条件“块”的开头吗?因此,没有复合语句的 if 语句也将代表这样的块。我的理解正确吗?
-
没有。块是块,别名是复合语句,以 { 开头,以 } 结尾。我关于声明被“移到声明它们的块的开头”的评论非常不清楚,所以我删除了评论并试图用一个答案来详细说明这个主题。是的,“条件声明”不是一回事。
标签: c arrays goto variable-declaration