我一直想知道,一般来说,在循环之前声明一个抛弃变量,而不是在循环内部重复,是否会产生任何(性能)差异?Java中的一个(毫无意义的)示例:
a)循环前的声明:
double intermediateResult;
for(int i=0; i < 1000; i++){
intermediateResult = i;
System.out.println(intermediateResult);
}
Run Code Online (Sandbox Code Playgroud)
b)声明(重复)内循环:
for(int i=0; i < 1000; i++){
double intermediateResult = i;
System.out.println(intermediateResult);
}
Run Code Online (Sandbox Code Playgroud)
哪一个更好,一个还是b?
我怀疑重复变量声明(例子b)在理论上会产生更多的开销,但是编译器足够聪明,所以它并不重要.实施例b具有更紧凑的优点,并且将变量的范围限制在其使用的位置.尽管如此,我倾向于根据示例来编码一个.
编辑:我对Java案件特别感兴趣.
为什么以下工作正常?
String str;
while (condition) {
str = calculateStr();
.....
}
Run Code Online (Sandbox Code Playgroud)
但据说这个是危险的/不正确的:
while (condition) {
String str = calculateStr();
.....
}
Run Code Online (Sandbox Code Playgroud)
是否有必要在循环外声明变量?
我只是想知道如果你做了这样的事情会有任何速度或效率的损失:
int i = 0;
while(i < 100)
{
int var = 4;
i++;
}
Run Code Online (Sandbox Code Playgroud)
宣告int var
一百次.在我看来会有,但我不确定.这样做会更实际/更快:
int i = 0;
int var;
while(i < 100)
{
var = 4;
i++;
}
Run Code Online (Sandbox Code Playgroud)
或者它们是相同的,速度和效率方面的?
我试图找出初始化某些变量时的最佳做法...我的代码目前看起来像这样:
int nHexCount = 0;
int prevState = sc.state;
bool bOnlySpaces = true;
bool bIsValidLabel = true;
bool bIsHotstring = false;
bool bIsValidName = true;
bool bIsValidExpStart = false;
bool fInExpression = false;
bool fInStringBlock = (sc.state == SCE_AHKL_STRINGOPTS || sc.state == SCE_AHKL_STRINGBLOCK);
for (; sc.More(); sc.Forward()) {
if (sc.atLineStart) {
if (!fInStringBlock && sc.state != SCE_AHKL_COMMENTBLOCK)
sc.SetState(SCE_AHKL_DEFAULT);
// Reset Status
prevState = sc.state;
bOnlySpaces = true;
bIsValidLabel = true;
bIsHotstring = false;
bIsValidName = true;
bIsValidExpStart = false;
fInExpression …
Run Code Online (Sandbox Code Playgroud) 我的问题是,如果我在循环外声明一个变量并在循环内每次重新初始化或在循环内声明和初始化,这是否重要?那么基本上这两种语法(性能,标准等)之间有什么区别吗?
int a,count=0;
while(count<10)
a=0;
Run Code Online (Sandbox Code Playgroud)
int count=0;
while(count<10)
int a=0;
Run Code Online (Sandbox Code Playgroud)
请假设这只是一个更大程序的一部分,并且body循环内部要求变量每次a
都有一个值0
.那么,这两种方法的执行时间会有什么不同吗?
方法1的优点是文件大小略小,因为源代码中的文本字符较少:
int i, j;
for (i = 0; i < numRows; i++)
for (j = 0; j < numCols; j++)
//<some code here>
Run Code Online (Sandbox Code Playgroud)方法2的优点是局部变量的范围较小.
int i;
for (i = 0; i < numRows; i++)
{
int j;
for (j = 0; j < numCols; j++)
//<some code here>
}
Run Code Online (Sandbox Code Playgroud)即使在今天的现代计算机中优化的差异可以忽略不计,哪种方法被认为是"更好"的代码?
编辑以澄清此问题不重复:
这个问题是基于当前的C11标准,它不允许这样的语法:
for (int i = 0; i < numRows; i++)
Run Code Online (Sandbox Code Playgroud)
在C++和C99中,这种语法是完全可以接受的,而C11不允许在for
语句中使用变量声明.
编辑以纠正错误信息:
我以为我正在使用C11,因为我最近从CodeBlocks下载了编译器,所以这就是为什么我说C11不允许声明中的变量声明for
.但事实证明我实际上使用的是C90,这是我问题的根源.
在我大学的 C++ 课程中,我习惯了(并被教导)在for 循环中声明 int 的做法,如下所示:
for(int i = 0; i < 5; i++)
{
// code
}
Run Code Online (Sandbox Code Playgroud)
但是现在我在一个机电一体化课上,我们用 c 和 Arduino 编写,老师告诉我这样做是不好的做法,并建议这样做:
int i = 0;
for(i; i < 5; i++)
//code
Run Code Online (Sandbox Code Playgroud)
为什么一个比另一个更受欢迎?
例如
int i, a, c, d; // these vars will only be used in while
while(bigNumber--) {
i = doSomething();
// **
}
Run Code Online (Sandbox Code Playgroud)
和
while(bigNumber--) {
int i, a, b, c; // i'd like to put it here for readability
i = doSomething();
// **
}
Run Code Online (Sandbox Code Playgroud)
它在性能方面有很大区别吗?
为什么我可以在 for 循环的每次迭代中在 for 循环 [for (auto val: k0L){...}] 中声明和定义 3 个变量?当我执行 g++ code.cpp 时,编译器不会抱怨。我知道一个变量只能声明一次。我知道我不能写 int a = 5; int a = 6; 在 main() 范围内。但是,这就是我在 for 循环中所做的。谢谢!
#include <iostream>
#include <vector>
#include <fstream>
#include <math.h>
#include <algorithm>
#define PI 3.14159265
std::vector<double> linspace (double start, double end, size_t points) { // will be used in main(), details of this function are not important.
std::vector<double> res(points);
double step = (end - start) / (points - 1);
size_t i = 0;
for …
Run Code Online (Sandbox Code Playgroud) 代码是:
int euler4 ()
{
for (int i = 999; i > 100; i= i - 1; ){
for (int j = 999; j > 100; j--;){
int n = i*j;
bool ptest = ispalindrome(n);
if (ptest){return n;}
}
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
错误发生在第一行int euler()上,它显示为:"error:expect primary-expression before')'token."
我是C++的新手,但我在同一代码中有其他for循环,并且没有问题.我很难过.
c++ ×5
c ×4
for-loop ×3
declaration ×2
java ×2
loops ×2
performance ×2
variables ×2
while-loop ×2
nested-loops ×1
optimization ×1
scope ×1
stdvector ×1