为什么原始的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最初排除异常,因为设计者认为这样做会使语言更好)?
我所查找的地方
- 我已经尝试在这里和通过一般的网络搜索中找到答案,但没有成功:我想到的所有搜索词似乎都充斥着关于C for循环初始声明、“在C99模式下使用”错误消息等混淆的问题(除了搜索词“基本原理”,它引导我找到了有用的信息,但没有具体回答这个问题)。
- 我查阅了Dennis Ritchie本人关于开发语言的文章这里,但没有发现任何东西。
- 我查阅了我的《C程序设计语言》(第2版)副本,首先阅读了实际的for循环解释部分,然后检查了索引以查找其他提到“for”/“for loop”的地方。我阅读了其他几个可能提到它的地方,但什么也没找到。
for
循环的控制部分定义的变量并不在块的开头,因此没有期望它们会被支持。C++引入了这两个概念(在块中任何位置定义变量以及在for
循环的控制部分定义变量)- C99也加入了它们。 - Jonathan Leffler