Есть ли существенная разница между вложением цикла while в цикл while и вложением цикла if-else в цикл while? (C ++) - PullRequest
0 голосов
/ 29 ноября 2009

РЕДАКТИРОВАТЬ: я забыл добавить часть цикла второго кода.

Глядя на два стиля кода

while(some_loop_cont_val)
{
    while(pre_x is not done)
    {
        //do action pre_x
    }
    //do action x
}

и

while(some_loop_cont_val)
{
    if(pre_x is not done)
    {
        //do action pre_x
    }
    else
    {
        //do action x
    }
}

Первый цикл выполняет pre_x (возможно, итеративное действие), затем x, второй выполняет часть pre_x, затем, если он не выполнен, продолжает делать это до тех пор, пока не выполнит, затем выполняет x. Так что оба делают pre_x и затем x.

Мне интересно, есть ли какие-либо различия между этими двумя аспектами, как с точки зрения эффективности, так и другими способами (т. Е. Если есть какой-то тонкий эффект, который возникнет очень редко, и т. причина использовать одно вместо другого в конкретной ситуации, или если это просто вопрос предпочтений.

Ответы [ 8 ]

4 голосов
/ 29 ноября 2009

В первом примере второй цикл while может фактически зацикливаться.

Второй пример условно совершает два разных действия.

1 голос
/ 29 ноября 2009
  1. break оператор из внутреннего цикла не позволит вам выйти из внешнего. Таким образом, вы пропустите некоторые полезные функции, представленные операторами break / continue. Для сравнения:

    while(some_loop_cont_val) {
        if(some_det) {
            break;
        }
    }
    //"break" takes you here
    

    и

    while(some_loop_cont_val){
        while(some_det) {
            break;
        }
      //"break" takes you here
    }
    
  2. Другое дело, что циклу "while" требуется как минимум два сравнения : чтобы ввести его на 1-й итерации и не вводить на второй.

0 голосов
/ 29 ноября 2009

Логика этих двух абсолютно различна .

Если some_loop_cont_val истинно и action pre_x делает some_loop_cont_val false, только ваш первый пример будет выполнять действие x

0 голосов
/ 29 ноября 2009

Внутренний цикл первого стиля будет продолжать повторяться, когда условие внешнего цикла становится ложным, если условие внутреннего цикла остается истинным.

Напротив, ветвь if не может многократно выполняться, когда условие внешнего цикла становится ложным, независимо от того, остается ли условие if истинным.

(И повторять то, что говорили другие люди: if-else - это не цикл. Например, while - это структура управления, но это не цикл.)

0 голосов
/ 29 ноября 2009

Если вы сделаете правильные изменения в коде, чтобы сделать логику равной, использование одного цикла будет более эффективным из-за лучшего прогнозирования ветвления процессором (один цикл легче прогнозировать, чем два - у вас, вероятно, меньше ложных прогнозов вот так)

Подробнее о прогнозе ветвления: http://en.wikipedia.org/wiki/Branch_predictor

0 голосов
/ 29 ноября 2009

Важно помнить, что на уровне машинного кода это все равно будет оператором скачка некоторого описания. единственное, чего вы добились, - это головной боли при использовании языковой функции для чего-то другого, чем она была разработана.

В некоторых низкоуровневых программах (драйверы и т. Д.) Такая оптимизация вполне может потребоваться, однако я сомневаюсь в этом. Если вы достигнете этого уровня, то лучше написать что-нибудь в ассемблере или использовать макросы, чтобы скрыть неоднозначность.

0 голосов
/ 29 ноября 2009

Эффективность и предпочтение irellevent, два фрагмента кода никоим образом не эквивалентны. if-else - это , а не конструкция цикла.

0 голосов
/ 29 ноября 2009

Пожалуйста, пожалуйста, не беспокойтесь об эффективности таких вещей !!!

Код action должен быть почти ничем , чтобы вы когда-либо заметили разницу.

И , если это почти ничто, профилирование , и показывает, что программный счетчик тратит более 10% своего времени в этом цикле, а затем подумайте о его эффективности. Тогда вы можете развернуть цикл или сделать другой ум, если хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...