C 在循环中定义数据类型

C 在循环中定义数据类型,c,C,这似乎是一个简单的问题,但对我来说并不直观 假设你有这样一个循环: int i; for(i=0;i<10;i++){ float b = 25.2; float c; c=b+i; } 在每一个循环中将b定义为浮动会有任何负面影响吗?我原以为会的,但我不太确定,因为我见过与此相关的代码 谢谢…假设编译器没有在这里进行优化,那么在每个循环上分配浮点值会有一点损失。最好在循环之外声明float 但这取决于代码。有时,这样声明变量更为简洁。您在性能方面付出的代价可能很小。假设编译器没有在这里

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

假设你有这样一个循环:

int i;
for(i=0;i<10;i++){
float b = 25.2;
float c;
c=b+i;
}
在每一个循环中将b定义为浮动会有任何负面影响吗?我原以为会的,但我不太确定,因为我见过与此相关的代码


谢谢…

假设编译器没有在这里进行优化,那么在每个循环上分配浮点值会有一点损失。最好在循环之外声明float


但这取决于代码。有时,这样声明变量更为简洁。您在性能方面付出的代价可能很小。

假设编译器没有在这里进行优化,那么在每个循环上分配浮点值会有一点损失。最好在循环之外声明float

但这取决于代码。有时,这样声明变量更为简洁。您在性能方面付出的代价可能很小。

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

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

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


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

这完全可以,事实上,如果您只在循环中使用浮点,我认为在任何一个好的编译器中,这一点都不重要

将代码清晰性放在循环中是有意义的,但这主要是一个品味问题

但要注意这样的情况

int i,j;
for ( i=0;i<count;i++ )
{
    int j;
    // stuff
}
我见过类似的情况不会生成编译器警告,这导致很难跟踪bug


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

这是完全可以的,事实上,我认为在任何一个像样的编译器中,如果只在循环中使用浮点,这一点都不重要

将代码清晰性放在循环中是有意义的,但这主要是一个品味问题

但要注意这样的情况

int i,j;
for ( i=0;i<count;i++ )
{
    int j;
    // stuff
}
我见过类似的情况不会生成编译器警告,这导致很难跟踪bug


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

如果在用大括号括起来的块中定义变量,它只会限制其范围,则不能在外部使用它。它只是让程序更干净

程序可能会在堆栈上的开始括号处分配变量,在结束括号处分配变量,但是一个好的编译器应该在进入和离开子程序方法时这样做


也是一个C++特性,它确实是一个很好的结构化编程,它也使得C++编程有点像使用脚本语言,在这里你不需要声明变量,但是不要告诉严重的C或java程序员。< /P> < P>如果你用括号括起来的块中的变量定义一个变量,它就限制了它的范围,你不能在外面用。它只是让程序更干净

程序可能会在堆栈上的开始括号处分配变量,在结束括号处分配变量,但是一个好的编译器应该在进入和离开子程序方法时这样做

也是一个C++特性,它确实是一个很好的结构化编程,它也使得C++编程有点像使用脚本语言,在这里你不需要声明变量,但是不必把它告诉严肃的C或java程序员。因此,在循环中声明变量实际上不会对性能产生影响,因为在连续迭代期间不需要分配更多的堆栈空间。我想C99编译器也会做类似的事情,但我不确定

大多数编译器都会对此进行优化。最坏的情况是在堆栈上创建一个新的浮点,这在大多数体系结构上是一个非常便宜的操作。在某些情况下,在使用前立即声明变量可能会更快。不过,如果您的程序对性能非常敏感,那么您应该首先使用汇编语言

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

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

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

大多数编译器都会对此进行优化。最坏的情况是在堆栈上创建一个新的浮点,这在大多数体系结构上是一个非常便宜的操作。在某些情况下,在使用前立即声明变量可能会更快。不过,如果您的程序对性能非常敏感,那么您应该首先使用汇编语言

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


就我个人而言,我一直在循环中声明变量。它执行得很好,并且清楚地表明存在要在该循环中使用的变量。这是一个结构化的代码,它清楚地指明了代码的意图。根据我所知,在任何块的开始声明变量是C特征,而不是特别是C++。C++允许在块中任意点任意声明新的变量,而严格的C89只允许在块的开始。这不适用于本例。C99也允许与C++相同的变量声明行为,并且这种行为已经成为GNU GCC中的编译器扩展的一部分。我记得以前所有的局部变量都需要在任何代码之前列出。也许,这是早期的C标准。也许我记错了。我很老了!嗯,它说在C中,声明必须在块的开头,而不是函数的开头:是的,也许你是对的。根据你使用的C标准,在循环中声明的变量可能在循环后可用,甚至会导致命名冲突!。C99或更高版本指定循环中声明的变量的作用域为该循环。它在早期版本中是不明确的,在编译器之间不同。在我知道的,在任何块的开始声明变量是C特征,而不是特别是C++。C++允许在块中任意点任意声明新的变量,而严格的C89只允许在块的开始。这不适用于本例。C99也允许与C++相同的变量声明行为,并且这种行为已经成为GNU GCC中的编译器扩展的一部分。我记得以前所有的局部变量都需要在任何代码之前列出。也许,这是早期的C标准。也许我记错了。我很老了!嗯,它说在C中,声明必须在块的开头,而不是函数的开头:是的,也许你是对的。根据你使用的C标准,在循环中声明的变量可能在循环后可用,甚至会导致命名冲突!。C99或更高版本指定循环中声明的变量的作用域为该循环。它在早期版本中是不明确的,并且在不同的编译器之间是不同的。@O_O:GCC中的优化级别,-O1到-O3这是字母O,而不是数字0告诉编译器从一点点优化代码到相当多-操作系统指示编译器优化代码大小。看那些是优化标志。数字越高,技巧就越多。但这些技巧也可能有缺点:优化的汇编可能更快,但也更大,调试高度优化的代码可能更难,因为与C代码的1:1关系更远。@O_O:GCC中的优化级别,-O1到-O3这是字母O,不是数字0告诉编译器从一点点优化到相当多的代码-操作系统指示编译器优化代码大小。看那些是优化标志。数字越高,技巧就越多。但这些技巧也可能有缺点:优化的汇编可能更快,但也更大,调试高度优化的代码可能更难,因为与C代码的1:1关系更为遥远。