Циклы (GCC.4.2)

Тема в разделе "LANGS.C", создана пользователем strojtel, 30 мар 2008.

  1. strojtel

    strojtel New Member

    Публикаций:
    0
    Регистрация:
    30 мар 2008
    Сообщения:
    3
    Объясните почему это: for (int i = -1; --i; i >=0);
    работает не так как это: for (int i = -1; i >=0; --i);
    хотя при: i >= 0 все ок?
     
  2. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    strojtel
    Imho сравнивать эти циклы не корректно.
    В верхнем, индекс меняется от -1 до 1 (т.е. -1, -2, ..., INT_MIN, INT_MAX, INT_MAX-1, ..., 1), а нижний вообще не должен выполнять итераций, т.к. результатом проверки условия -1 >= 0 перед первой итерацией является ложь.
     
  3. strojtel

    strojtel New Member

    Публикаций:
    0
    Регистрация:
    30 мар 2008
    Сообщения:
    3
    а почему в первом -1 >= 0 не является ложью?
     
  4. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    strojtel
    В первом цикле между --i и i >= 0 стоит semicolon, следовательно, условие выполнения очередной итерации цикла - это не равенство нулю результата операции префиксного декремента переменной i, а операция сравнения ни как на цикл не влияет (imho правильный компилятор должен ее игнорировать).
     
  5. strojtel

    strojtel New Member

    Публикаций:
    0
    Регистрация:
    30 мар 2008
    Сообщения:
    3
    о точно дело в ";" :)
    for (int i = -1; --i >=0; ); - работает правильно! спасибо!!!

    вот интересно с точки зрения оптимизации:
    1) for (int i = count(); --i >=0; );
    2) for (int i = count()-1; i >=0; --i);
    они равнозначны?
     
  6. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    strojtel
    Imho оба варианта не имеют ни какого отношения к оптимизации.
    Правильный компилятор _обязян_ проигнорировать их (возможно оставив только вызов функции count, вдруг она влияет на глобальные переменные и т.п.), потому что в обоих случаях тело цикла _пустое_, т.к. после закрывающейся скобки сразу следует semicolon.

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