让我们假设它不仅在视觉工作室中,而且在C99,C11等中。
在for语句中有两种不同的方式来声明变量“i”。
1)
int i;
for(i = 0 ; i < index ; ++i)
2)
for(int i = 0 ; i < index ; ++i)
两者都一样。但我认为它们之间会有一些差别。 你对此有什么想法吗? 如果是,请告诉我。
我只是想知道你的意见,以及它的运作方式。
对不起。对于答案,我知道“我”的范围是不同的。
系统(我的意思是内存等)或编译器的工作方式有何不同,或者汇编的代码是不同的或类似的东西。
答案 0 :(得分:3)
我只是想知道你的意见,以及它的运作方式。
在第一种情况下,i
的范围更大。
同样,某些C标准版本允许您仅在函数开头声明变量,因此在第二种情况下声明无效。
否则没有太大区别。
答案 1 :(得分:2)
唯一的区别是,在第一种情况下,变量i
在for
范围之外,因此您可以稍后使用它。效率方面没有差异。
如果您只使用i
一次,那么第二种情况肯定更好:
for(int i = 0 ; i < index ; ++i)
如果你有使用索引i
的循环,那么在所有循环之外声明它可能是有意义的。
但一般来说,规则是限制变量的范围 - 因此第二种情况更好。限制变量的范围通常更安全。
值得注意的是,第二种情况语法仅适用于C99或更新的C11(不适用于旧的C89)。因此,如果在循环内声明变量,一些编译器会抱怨。例如,gcc
需要显式标记-std=c99
才能允许该语法。
答案 2 :(得分:1)
i
的范围和生命周期不同。
在第二个例子中,它就在循环体内部。首先,它超越了它。
除此之外,他们是平等的。
答案 3 :(得分:1)
在for循环初始化中声明一个新变量是 C99 扩展名。
C89 要求在块的开头声明变量 从语义上讲,在循环的初始化部分中声明变量会限制变量&#39;范围到循环体。
通常需要限制范围,以避免在执行for循环体之后滥用变量。例如,如果您正在进行简单的迭代,则可能不希望索引在for循环之后存在。
没有正确的答案可供使用。问题变成了你想要的范围,以及你打算支持哪些编译器/语言版本。
答案 4 :(得分:-2)
在C99中,正确的方法是否1)。它要求在使用前声明变量。看起来您的编译器支持多种标准,因此它看起来对您使用的构造是透明的,并且它们都会导致相同的行为。在这种情况下,我个人的偏好是2)因为它减少了变量i的范围,也防止了单位化的价值使用(风险较小)。