在循环之前或循环内定义变量

时间:2019-08-23 20:16:04

标签: c

在C中定义for循环变量的以下两种方法之间是否有区别?

int i;
for (i = 0; i < X; i++) {
    // something
}

并且:

for (int i = 0; i < X; i++) {
    // something
}

如果i总是一掷千金,我更喜欢使用第二种方法,但是出于任何原因这样做不是一个好主意吗?

3 个答案:

答案 0 :(得分:2)

是的。

由于KeyEvent.VK_C变量通常仅用于计算所需的迭代次数,因此,使变量存在于循环范围之外是没有意义的。如果可以的话,应该避免这种情况。

正如对该问题的一些评论所提到的,在某些情况下您不能使用第二个,但这不是一般情况。

对于后来编译为同一程序集的编译器,这可能是正确的,但是从概念上讲,第二个方法更清洁,对于从外部读取代码的人来说,很明显该变量不再使用。

希望这会有所帮助!

答案 1 :(得分:1)

  

但是有什么理由这样做不是一个好主意吗?

在C语言中,您应该首选第二种形式,因为它减小了变量的范围,并使其在使用位置更加明显。除非...

  • ...这违反了给定项目的编码准则。例如,Linux内核在函数顶部声明所有变量。

  • ...您要符合C90:您不能使用循环初始声明。

但是,在C ++中,对象可能具有非常昂贵的构造函数,这意味着有时您可能想重用它们,而不是每次都初始化一个新的对象(例如,如果在对象体内构造一个新的对象)循环)。

答案 2 :(得分:1)

两者之间有很多区别。

第二种形式在1989 ANSI(1990 ISO)C标准中是非法的。从1999年开始,C语言和标准C ++语言都支持第一个语言。某些早于1999年的C编译器支持它,这是非标准或可选扩展,或者因为这些编译器实际上是具有C模式的C ++编译器。

在第一种形式中,i存在于循环之后,因此仍可以访问其值,但是重新定义它会导致诊断(编译时错误)。在第二种形式中,i在循环之后不存在,因此在循环之后访问其值可以进行诊断,但是可以i重新定义。

一般而言,建议确保变量仅在需要的时间存在,而在不再需要时不再存在。第二种形式明确允许。

很显然,需要在循环外部存在的变量需要在循环外部定义。但是,如果不需要在循环外使用变量i,则我倾向于第二种形式。这使编译器可以发现问题,例如在循环后意外使用变量i

一些较旧的C和C ++编译器(主要是在1998年C ++标准批准之前,但有些是在2000年代早期)实现了第二种形式,因此变量i在循环之后仍然存在。使用这些编译器时,这实际上使两种形式等效。