在循环中定义数据类型

时间:2011-01-06 22:34:20

标签: c

这似乎是一个简单的问题,但对我来说并不直观。

假设您有这样的循环:

int i;
for(i=0;i<10;i++){
float b = 25.2;
float c;
c=b+i;
}

在每个循环中将b定义为float是否会产生任何负面影响?我认为它会有,但我不太确定,因为我已经看到了与此相符的代码...

...谢谢

6 个答案:

答案 0 :(得分:5)

这是完全可以的,事实上,如果你只在循环中使用float,我认为在任何体面的编译器中都不重要。

将代码清晰度放入循环中确实有意义,但这主要是品味问题。

但请注意

等情况
int i,j;
for ( i=0;i<count;i++ )
{
    int j;
    // stuff
}

我已经看到类似的情况没有生成编译器警告,这使得难以追踪错误。

编辑刚测试,gcc编译方式不同,但-O3生成的程序集完全相同。使用gcc -S file.c进行测试。更新:-O1就足够了,它实际上取决于您声明变量的顺序。如果在您的示例中float被声明为int i;以下,则编译的程序集仍然是相同的。

答案 1 :(得分:3)

在前C99编译器上,每次迭代通常会使用相同的堆栈空间,因此实际上对于在循环中声明变量没有性能影响,因为没有必要分配更多的堆栈空间在连续迭代期间。我想C99编译器会做类似的事情,但我不确定。

大多数编译器都会优化它。最糟糕的情况是你在堆栈上创建一个新的浮点数,这在大多数架构上都是一个非常便宜的操作。可能存在这样的情况:在使用之前立即声明变量甚至更快。但是,如果您的程序对性能敏感,那么您应该首先使用汇编语言。

C99及更高版本指定变量的范围限定为创建它们的循环,而早期版本的C是不明确的。不同的编译器以不同方式实现它这一点很重要,因为如果在包含循环的函数范围内存在同名变量,则可能会遇到C99前编译器的命名冲突(因为它们会将变量视为作用域的函数)。

就个人而言,我一直在循环中声明变量。它表现良好并且清楚地表明存在要在该循环中使用的变量。这是一个以明确表示该代码意图的方式构建代码的问题。

答案 2 :(得分:1)

假设编译器在这里没有进行优化,在每个循环中分配浮点数都会受到一些小的惩罚。将循环声明在循环之外可能会更好。

这取决于代码。有时,声明变量就更清晰了。你在演出中付出的代价可能非常小。

答案 3 :(得分:1)

根本不重要。您可能还想看一下这篇文章:[1]

[1] Difference between declaring variables before or in loop?

答案 4 :(得分:0)

您没有初始化b,因此您使用它来调用未定义的行为。

如果您担心性能问题,编译器可能只会优化分配。

答案 5 :(得分:-2)

如果你在一个块中定义一个变量(用大括号括起来的东西)它只是限制它的范围,你不能在外面使用它。它只是使程序更清洁。

程序可以在开始支撑上的堆栈上分配你的变量并在结束支撑处下降,但是一个好的编译器应该在进入和离开子程序(方法)时这样做。 / p>

此外,它是一个C ++特性,实际上是结构良好的编程的一步(并且它使C ++编程有点像使用脚本语言,你不需要声明变量,但不告诉这对于严肃的C或Java程序员而言。)

相关问题