【问题标题】:Simplyfying the use of '?:' conditional operator简化 '?:' 条件运算符的使用
【发布时间】:2012-01-20 22:36:16
【问题描述】:

我有一个这样写的循环

for( i = (count>=0)?1:-1;(count>=0)?i<=count:i>=count;(count>=0)?i++:i--){
           do_something_with( i )
        }

如您所见,我在循环初始化中使用了 ? 运算符 3 次。

有什么办法可以简化吗? 目前,cpu 必须计算至少 2 个额外的决策和最多 3 个额外的决策 对于每一次迭代。我正在努力减少这种情况。

Ps:我尽量避免使用if 语句。

目前我使用 javascript 作为一种语言

【问题讨论】:

  • 为什么要避免 if 语句?
  • 好吧,我尽量减少行数,这就是为什么
  • “我试图减少行数” - 为什么?除非您要摆脱冗余,否则这通常是个坏主意。
  • 为什么这么少的代码行?根据语言的不同,代码行数无关紧要,都会被优化。
  • @PaulR 我知道这不是一个好主意,但我正在尝试一些挑战。

标签: javascript optimization for-loop conditional-operator


【解决方案1】:

您可以在循环开始时做一次决定,然后使用!= 运算符进行比较:

for (var dir = count >= 0 ? 1 : -1, i = dir; i != count + dir; i += dir){
  do_something_with(i);
}

演示:http://jsfiddle.net/Guffa/2Z369/

【讨论】:

  • 这个方法看起来很不错,但是我需要它迭代直到值 count ,即如果 count 是 5 i 必须循环到 5
  • @GautamK:我明白了。然后你比较count + dir。我更新了代码。
【解决方案2】:

在循环体中形成你的逻辑,例如:

// reverse count if required
int fixedCount = count >= 0 ? count : 0 - count;
for (i = 1; i <= fixedCount; i++)
{
    // reverse i if required
    int fixedIndex = count >= 0 ? i : 0 - i;

    do_something(fixedIndex);
}

【讨论】:

  • -1,如果count &lt; 0,此循环将只运行一次或根本不运行,具体取决于语言。
  • @CoreyOgburn - 很好的捕获,也颠倒了计数,仍然是 2 个检查而不是 3 个
  • 删除 -1。它现在可以工作了,但也许比?: 分配fixedCount 更好的选择是Math.abs(count)
  • 这是有争议的,一方面,现在的逻辑与固定索引的确定更加一致。偏好问题,更可能与语言无关
猜你喜欢
  • 2022-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-11
  • 2012-12-05
  • 2016-04-18
相关资源
最近更新 更多