为什么原始 C 语言不支持 for 循环初始化中的初始声明?
显然,最初的创造者,然后是 C99 之前的标准化,并没有这样指定。但我似乎找不到任何理由来解释为什么做出这种设计选择。
我似乎找到的最接近答案的是这个答案,它解释了如何禁止混合声明和代码,以便在重要时允许编译器单次返回。乍一看,for 循环语句中的声明与混合代码的声明具有相同/相似的问题是有道理的。
但是,C99 之前的 C确实支持块开头的声明:
{
unsigned int i;
for(i = 0; i < WHATEVER; i += 1)
{
/* ... */
}
}
我个人没有看到编译器逻辑与此有何本质不同:
for(unsigned int i = 0; i < WHATEVER; i += 1)
{
/* ... */
}
在我看来,如果编译器可以执行前者的单遍,它也可以执行后者。它可能要求一个for
语句总是创建一个范围块(即使后面只有一个语句而不是一个语句{ ... }
块),但我想不出这种语义破坏任何其他 C99 之前的 C 代码的方法(或者for 语句后跟一个块,在这种情况下它已经“作用域”,或者它后面跟着一个语句,在这种情况下,无论如何都不允许在该单个语句中使用新声明)。
那么,为什么最初省略了这个语法“功能”?我认为在不违反当时的性能目标的情况下支持是微不足道的,我错了吗?当时已知的语言解析器/编译器技术是否使它看起来更难?它只是因为极简设计/心态而被省略了吗,因为在功能上可以做同样的事情(阻塞 for 循环)?或者是否有明确的语言设计理由反对它(例如,Go 最初是如何排除异常的,因为设计者认为这会产生更好的语言)?
我看过的地方
- 我已经尝试在这里和通过一般的 web-search-fu 找到答案,但没有运气:我想到的所有搜索词似乎都充斥着关于 C for loop 初始声明的困惑问题,“在 C99 模式之外使用” ” 错误消息等(除了搜索词“基本原理”,它引导我找到有用的信息,但没有具体回答这个问题)。
- 我搜索了Dennis Ritchie 本人关于开发该语言的这篇文章,但没有发现任何内容。
- 我搜索了我的 C 编程语言(第 2 版)的副本,首先阅读了实际的 for 循环解释部分,然后检查了索引中其他提到的“for”/“for 循环”。我已经阅读了其他几个我认为可能会提到它的地方,但一无所获。