理解奇怪的c++ for循环吗?



我刚刚遇到了一些代码,我不确定为什么这样做。

注意,这是相当旧的代码,所以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规则。或者是从别处抄袭来的

相关内容

  • 没有找到相关文章

最新更新