前C99 C的基本原理在for循环中没有初始声明?

mtr*_*eur 5 c c89 ansi-c

为什么原始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最初是如何排除异常的,因为设计师认为这是为了更好的语言)?

我看的地方

  • 我试图在这里找到答案并通过一般的web-search-fu,没有运气:我想到的所有搜索词似乎都充满了关于C for循环初始声明的混乱问题,"在C99模式之外使用"错误信息等(除了搜索术语"基本原理",它引导我获得有用的信息,但没有具体回答这个问题).
  • 我在Dennis Ritchie自己搜索这篇关于语言开发的文章时没有发现任何东西.
  • 我搜索了我的C语言编程语言(第2版),首先阅读实际的for循环解释部分,然后检查索引以获取"for"/"for循环"的其他内容.我读过其他几个我认为可能会提到它的地方,但一无所获.

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中排除这些特征有任何特定的决定或理由 - 简而言之,它可能根本就没有被考虑过.

  • K&R只是厌倦了编写汇编程序,并且想要一种简单的语言,并且几乎可以直接转换为汇编程序,因此他们可以继续在UNIX上工作.在我早期(1983年),一个优秀的C程序员是知道编译器生成的汇编程序的人. (3认同)
  • 找到C99的基本原理.接近开始(引言的第一页),它说:_总体目标是为[C]制定一个清晰,一致且明确的标准,该标准编纂了C的常见现有定义,并促进了用户程序的可移植性......最初的X3J11章程明确要求编纂共同的现行做法,而C89委员会在任何明确和明确的地方都坚持先例.绝大多数语言......与Brian Kernighan和Dennis Ritchie的C编程语言的附录A中的定义完全相同... _ (2认同)