For 循环初始化语句中的变量声明

Variable Declaration Inside For Loop Initialization Statement

我有一个关于初始化 for 循环的简单问题。

这是我的 for 循环声明:

for (int i=player.x-xIndex-1; i<=player.x+xIndex+1; i++)
{
    for (int j=player.y-yIndex-1; j<=player.y+yIndex+1; j++)
    {

    }
}

我的问题是:

在声明时将索引 i 和 j 的值设置为非静态整数值是不好的做法吗?

代码会在执行开始时只评估 i 和 j 的最小值和最大值 once,还是会评估这些值(即 player.x+xIndex +1,等等)次循环执行。

如果你们能对我的问题有所启发,那就太棒了!

伙计们,我是个业余爱好者。说真的。

谢谢 :D

根本不是业余问题。 "initialization" 表达式仅在第一个 运行 时计算,因为它们当然只使用了一次。

对于循环的"condition"(在每次迭代结束时测试的中间表达式),在最坏的情况下它可以在每次迭代中被评估。因为如果(在这种情况下)player.y 在循环期间实际发生变化怎么办?

但是,如果大多数现代编译器可以检测到最终值在循环期间可证明永远不会改变,则它们可能不会在每个循环中计算整个内容。

如果您想双重确定并手动处理执行路径,您可以自己显式 "hoist" 循环外的条件结束表达式,例如:

int maxValue = foo.x + y.bar + 12 + myString.length;
for (int i = 0; i < maxValue; i++) {
    ....

但现在标准样式免责声明:过早优化会使代码的可读性降低,而且没有任何可证明的好处。除非你在那个条件表达式中做真正的工作,或者循环是 运行 无数次迭代,否则一些额外的计算不会对你造成太大伤害,并且可能值得保留,这样你自己和其他人就更清楚了你正在尝试做。