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

时间:2011-08-27 23:37:46

标签: c

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

5 个答案:

答案 0 :(得分:9)

这是一个传统,来自早期的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;)。

答案 1 :(得分:7)

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

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

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

答案 2 :(得分:2)

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

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

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

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

尝试使用过去的原始功能编写编译器,并且您会发现灵活性是您为了使软件正常工作而宁愿杀死的。

首先放置变量,然后其他语句简化了解析器/编译器代码。