我刚刚遇到了一些代码,我不确定为什么这样做。
注意,这是相当旧的代码,所以for (auto i : x)
不是一个选项。
代码是:
INT_PTR i,c;
for(i=0,c=m_array.GetSize();i<c;i++)
{
// Do stuff, i & c are not changed inside the loop
}
我本来会使用单字母变量,但那是另一个参数:
const INT_PTR c = m_array.GetSize();
for (INT_PTR i = 0; i < c; i++)
{
// do stuff
}
第一种方法是否有一些我不知道的性能优势?
我认为代码示例之间没有区别。然而,一个"聪明"的人;编译器会优化的。
很久以前,有些编译器早就忘记了第一种方式是c语言的唯一方式。
在旧的方言中,包括原始的方言,函数会这样定义:
int foo(a, p)
int a;
char *p;
{
}
并声明如下:
int foo(int , char ) ;
int foo2(); // unknown arguments
int foo3(void); // no arguments
变量必须在任何其他代码发生之前声明,并且它们的生命周期和可见性被延长,直到函数返回其调用者。前面提到的语法一开始是唯一的,后来的声明包含在for()
头文件中,但是变量仍然在外部可见。后来ANSI和ISO标准有了很大的变化。
在现代C和c++中,for循环的原始样式导致如果for()
不包含初始化并且没有发生迭代,则可见变量可能保持未初始化。它的一个优点是可以"初始化"。甚至在c++ 17之前,不兼容类型的变量(这里有引号是因为技术上它是赋值的,c++为这些赋值提供了不同的规则):
float arr[] = { 3,4,5,6 };
int i, e;
float v;
for( i = 0, e = sizeof(arr)/sizeof(arr[0]), v = arr[i]; i < e; v = arr[++i] )
{
}
在工作中,只要我看到其他程序员在c++项目中使用C风格的函数设计,我就开始仔细检查那些代码。有时他们会不小心引入错误或不正确的行为,因为他们显然遵循K&R; C规则。或者是从别处抄袭来的