2011-12-15 2 views
-2

У меня есть цикл написан как такSimplyfying использования «?:» Условного оператора

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

Как вы можете видеть, я использую время ? оператора 3 в инициализации цикла.

Есть ли способ упростить это? В настоящее время процессор должен вычислить как минимум 2 дополнительных решения и максимум 3 дополнительных для каждой итерации. Я пытаюсь уменьшить это.

Пс: Я стараюсь избегать использования заявлений if.

В настоящее время я использую JavaScript в качестве языка

+0

Зачем избегать утверждений? –

+0

Ну, я пытаюсь сделать количество строк меньше, поэтому – Gautam

+0

«Я пытаюсь сделать количество строк меньше» - почему ??? Это вообще плохая идея, если вы не избавляетесь от избыточности. –

ответ

2

Вы можете сделать это решение один раз в начале цикла, и использовать != оператор для сравнения:

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

Демо: http://jsfiddle.net/Guffa/2Z369/

+0

Метод кажется действительно приятным, но мне нужно, чтобы он повторялся до значения, т. Е. Если счет равен 5 'i' должен зацикливаться до 5 – Gautam

+0

@GautamK: Я вижу. Затем вы сравниваете с 'count + dir'. Я обновил код. – Guffa

1

Сформируйте свою логику в теле цикла, как:

// 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); 
} 
+0

-1, если 'count <0', этот цикл будет запускаться один раз или, может быть, совсем не в зависимости от языка. –

+0

@CoreyOgburn - Хороший улов, отменил счет, а еще 2 проверки, а не 3 – Polity

+0

Удалено -1. Теперь он работает, но, возможно, лучший выбор, чем '?:' Для назначения fixedCount будет 'Math.abs (count)'. –

Смежные вопросы