【问题标题】:Variable Declaration Inside For Loop Initialization StatementFor循环初始化语句中的变量声明
【发布时间】:2015-04-24 00:36:43
【问题描述】:

我有一个关于初始化 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 的最小值和最大值 一次,还是会评估这些值(即 player.x+xIndex+1 等)每次循环执行一次。

你们能解决我的问题的任何线索都会很棒!

伙计们,我是一个非常业余的人。认真的。

谢谢:D

【问题讨论】:

  • 仅供参考 - 这实际上是一个基本的 C 问题,因为问题中的代码都不是特定于 Objective-C(它是 C 的超集)。

标签: objective-c for-loop coding-style variable-declaration


【解决方案1】:

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

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

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

如果您想更加确定并处理执行路径,您可以自己显式地将条件结束表达式“提升”出循环,例如:

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

但现在标准风格的免责声明:过早优化会使您的代码可读性降低,而且没有可证明的收益。除非您在该条件表达式中进行实际工作,或者循环正在运行无数次迭代,否则一些额外的计算不会对您造成太大伤害,并且可能值得保留,以便您和其他人更清楚您想要做什么做。

【讨论】:

  • 我的循环只运行了 221 次,我想这算作“不运行无数次迭代”?
  • 另外,在您的“标准风格免责声明”中,这是一个非常重要的观点,非常感谢,这是我几乎没有记住的内容。
  • @J-Rock:重新迭代,正确。 (与任何事情一样,您必须考虑您的特定平台,您在循环条件中所做的工作,以及此代码路径对性能的敏感程度。但是在现代机器上进行几百次迭代没什么。)坚持下去,你会经常听到可读性免责声明——这是传统的智慧(虽然在你开始的时候并不总是很明显)过早的优化(正如它所说的那样)对你的代码的整体伤害比如果你盲目地做它所带来的帮助更大-- 最大化运行速度并不总是优先考虑的。
  • @J-Rock:另外值得一提的是——绝对避免在条件表达式中包含任何具有副作用(即改变某物的状态)的代码。即使执行起来很高效,也很容易产生意想不到的后果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-20
相关资源
最近更新 更多