为什么原始C语言不支持for循环初始化中的初始声明?
显然,原始创建者,然后是C99之前的标准化,并没有这样指定.但我似乎无法找到为什么做出设计选择的任何理由.
我似乎找到的答案最接近的是这个答案解释了混合声明和代码是如何被禁止的,以便允许编译器在重要时单回.乍一看,有意义的是,for循环语句中的声明与声明与代码混合时会产生相同/类似的问题.
但是,在C99之前的C 块确实支持了块开头的声明:
{
unsigned int i;
for(i = 0; i < WHATEVER; i += 1)
{
/* ... */
}
}
Run Code Online (Sandbox Code Playgroud)
我个人没有看到编译逻辑与此有何不同:
for(unsigned int i = 0; i < WHATEVER; i += 1)
{
/* ... */
}
Run Code Online (Sandbox Code Playgroud)
在我看来,如果编译器可以执行前一次通过,它也可以执行后者.它可能要求一个for语句总是创建一个范围块(即使后面跟着一个语句而不是一个语句{ ... }块),但是我想不出这种语义可以打破任何其他前C99 C代码的方法(或者for语句之后是一个块,在这种情况下它已经"作用域",或者后面跟着一个语句,在这种情况下,无论如何都不会在该单个语句中允许新的声明).
那么,为什么这个语法"功能"最初被省略了?我错误地认为在不违反当时的绩效目标的情况下提供支持是微不足道的吗?当时已知的语言解析器/编译器技术是否让它看起来更难?它是否因为极简主义的设计/心态而被省略,因为在功能上它可以做同样的事情(围绕循环)?或者是否存在明确的语言设计原因(例如,Go最初是如何排除异常的,因为设计师认为这是为了更好的语言)?
Pet*_*ter 10
我不相信有任何具体决定排除这些特征,也没有理由安装这样做.
浪漫似乎可以相信设计师(Kernighan,Ritchie等)只考虑所有可能性,并且只有经过深刻而有意义的考虑才能排除特征,现实是设计C的早期阶段(就像其他一些编程一样)语言)遵循一个更加谦逊的哲学,比如"从小开始,不要为添加功能而烦恼,除非程序员被阻止做某事".
for循环中的变量初始化等功能是程序员的便利 - 他们的缺席并没有阻止事情的完成.因此,即使有人乞求或竞选这样的功能(可能没有),它可能会按优先顺序排列.
至于事情是如何演变的......
在1999年之前,变量声明位于C中的块的开头(代码在{结束时开始并在结束时结束}),而不是在其他语句中.这是事物最初在预标准(K&R)C中运行的方式,以及像B这样的先前语言(实际上是前面语言的简化衍生物).
for循环中的变量声明/初始化首先引入C++.它很早就出现了(例如ARM中的第19节),并最终在1998年末批准的第一个C++标准中引入.
C标准委员会中有一些讨论,在起草C++标准(花了十年时间)的过程中,将C++的一些特性引入C中.这个讨论通常大多是"如果C中的任何其他内容破坏,那么我们加了这个?" 许多编译器供应商已经在他们的C编译器中实现了几个这样的功能作为可选扩展(或者他们的C编译器实际上是C++编译器,其设置可以禁用与C不兼容的C++功能),因此关于添加这些功能的讨论非常简短.因此,从C++中容易添加到C中的那些特征出现在1999 C标准中.for循环中的变量声明/初始化是这些功能之一.
从那段历史来看,没有证据表明从早期C中排除这些特征有任何特定的决定或理由 - 简而言之,它可能根本就没有被考虑过.