有没有人知道为什么必须在函数顶部定义变量

我有一个问题,有没有人知道为什么必须在函数开头初始化变量? 为什么不能像在C ++中那样在C中的函数中间初始化或定义变量?

这是来自早期C编译器的传统,当编译器在实际的函数代码开始之前需要所有局部变量定义时(生成正确的堆栈指针计算)。 这是在早期C语言中声明局部变量的唯一方法,包括预标准(K&R)和第一C标准,C90,发表于1989-1990(ANSI X3.159-1989,ISO / IEC 9899:1990)。

C99 – C的1999年ISO标准(ISO / IEC 9899:1999)允许在函数中间进行声明。

C ++允许这样做,因为它是比C.更新的语言.C ++标准是ISO / IEC 14882:1998和ISO / IEC 14882:2003,因此它们是1998年和2003年。

您可以在定义点或以后的任何时间初始化变量(给它一个值: a=4; )。

这是早期C的遗留问题.C99允许在函数中的任何位置定义变量,包括循环结构。

 for (int i = 0; i < 10; ++i) { int j; } 

回滚是从编译器在实例化函数代码之前需要知道函数堆栈大小的时候开始的。 随着编译器变得更好,要求变得烦人。

只要使用C99编译器,就可以在C中执行此操作。 限制在C99取消。

据推测,限制最初存在,因为编译器的能力较差,或者仅仅是因为没有人想过为程序员提供这样的便利。

在回答这样的问题时,有时候值得一试。 为什么C的原始设计师会以另一种方式完成它? 他们没有C ++来指导他们!

在C ++和C99中,您可以在函数中间定义变量。 你不能做的是一个尚未定义的变量。

从面向对象编程的角度来看,它没有多大意义:通过定义一个变量,你可以将一个对象带入生活(通过调用它的构造函数)。 在此之前,没有对象,所以在通过对象构造点之前没有任何东西可以交互。

尝试使用过去的原始function编写编译器,你会发现灵活性是你宁愿杀死软件才能运行的东西。

将变量放在第一位,然后其他语句简单地使它们的解析器/编译器代码更简单。