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

koo*_*ool 5 c

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

osg*_*sgx 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;在定义点或稍后的任何时间初始化变量(给它一个值:).


Ada*_*wes 7

这是早期C的遗留物.C99允许在函数的任何地方定义变量,包括循环结构.

for (int i = 0; i < 10; ++i) { int j; }
Run Code Online (Sandbox Code Playgroud)

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

  • 但即使早期的C允许在内部块中声明,也允许`goto`语句从外部跳转到这些块中.因此,在翻译每个函数体之后,解析时发出代码的编译器仍然需要在函数序言中回补本地变量大小.在早期的C中,不仅仅是编译器限制,我认为解释必须是每个人都习惯于将声明分开,这样设计师甚至不会想到它们与代码混合会很有用. (2认同)