C++ - вопрос

Тема в разделе "WASM.ZEN", создана пользователем scf, 12 ноя 2005.

  1. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Ustus







    Что интересно в стандарте сказано по этому поводу?
     
  2. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine




    Реализацией компилятора он не определяется, а зависит от настроек компиляции и вида аргументов.
     
  3. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    green



    Мда...
     
  4. infern0

    infern0 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2003
    Сообщения:
    811
    Адрес:
    Russia


    ты в этом уверен ?
     
  5. infern0

    infern0 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2003
    Сообщения:
    811
    Адрес:
    Russia


    и тут в теории могут быть глюки. А через точку с запятой все будет ок гарантированно.
     
  6. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    infern0



    Это стандарт. Точно также для || и &&. Если какой-то компилер не соответствует - это его проблема. (Точнее того, кто на нем пишет :)
     
  7. rgo

    rgo New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2005
    Сообщения:
    87


    вот, блин... ну что я могу сказать? lisp рулит.





    Да будет, но не стандартами а компилятором.

    а нет наврал слегка -- в C++ действительно определён в отличие от C. Каюсь.
     
  8. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    rgo



    А что плохого в том, что компилятору предоставлена свобода оптимизации при вычислении аргументов ?

    А форсировать порядок вычисления не проблема: давать ф-ции уже вычисленные аргументы во временных переменных.
     
  9. rgo

    rgo New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2005
    Сообщения:
    87
    компилятор пускай оптимизирует, и переменную мне не сложно завести если надо, но с моим пониманием языка это не совпадает... что потенциально ведёт к ошибкам. Хотя я пока не замечал таких ошибок.
     
  10. vito

    vito New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2004
    Сообщения:
    177
    rgo



    Аналогично.



    Вот что собрал на примере ++i + ++i + i++ + i++ (без оптимизации) :



    1. gcc - ошибка (определен?) ;

    2. intel - оценивает выражение слева -направо (определен) ;

    3. vc - получаем "стандартный глюк"(неопределен);

    4. bc - аналогично(неопределен-вообщее говоря оценивает выражение справа - налево).



    Интересеный получается результат.
     
  11. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Методом тыка баги компиляторов изучать - занятие опасное, лучше стандарт читайте - последний черновик доступен бесплатно.
     
  12. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    green







    С одной стороны это плохо, потому как возникает неоднозначность. Но с другой стороны, нехер писать такие проги, в которых порядок вычисления аргументов определяет результат работы.
     
  13. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    _DEN_



    Во-во.

    Возможность оптимизации кода как раз обеспечивается такими "неоднозначностями".

    Можно конечно ограничить компилятор вплоть до того, что указывать в каком регистре какую переменную держать.

    И превратить С++ в нечто вроде HLA.
     
  14. scf

    scf Member

    Публикаций:
    0
    Регистрация:
    12 сен 2005
    Сообщения:
    386
    а дело-то в том, что в моей проге порядок вычисления аргументов на результат работы не влияет

    Компилер просто пытается вычислить аргументы одновременно, не обращая внимание на то, что они используют одну переменную.

    Мой случай в релизе компилиться вообще во что-то вроде

    ...

    push ecx ; arg1

    push ecx ; arg2

    ...

    call printf
     
  15. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    scf



    А стандарт разве это запрещает ?

    - вот всё чем ограничен компилятор согласно стандарту.



    Т.е. ошибка не в компиляторе, а в компилируемом коде.



    P.S.

    Было бы конечно неплохо, если бы компилятор вычислял логические ошибки в программе.

    Впрочем VC++ некоторые такие ошибки находит (например бесконечную рекурсию).
     
  16. scf

    scf Member

    Публикаций:
    0
    Регистрация:
    12 сен 2005
    Сообщения:
    386
    гммм...

    Выходит, код

    my_func(rand(), rand());

    неверен? :)
     
  17. rgo

    rgo New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2005
    Сообщения:
    87
    чем же это он неверен? конкретно этот код верен, тк последовательные вызовы rand независимы между собой (или это не rand).

    но вот код

    my_func (peek (stk), push (1, stk));

    неверен. Потому, как стандарт не определяет в какой последовательности будут вызываться функции peek и push => компилятор считает что они независимы хотя это не так.
     
  18. scf

    scf Member

    Публикаций:
    0
    Регистрация:
    12 сен 2005
    Сообщения:
    386
    Код (Text):
    1.  
    2. //rand.c - single-threaded version
    3. int __cdecl rand (void)
    4. {
    5.         return(((holdrand = holdrand * 214013L + 2531011L) >> 16) & 0x7fff);
    6. }
    7.  


    Ещё как зависимы!
     
  19. rgo

    rgo New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2005
    Сообщения:
    87
    ты не так понял. Это суть rand -- генерить числа так, чтобы если я переставлю попарно a[2k] и a[2k+1] элементы последовательности, то основные её свойства (из-за которых её назвали rand), не изменяться. Хотя результат вычисления, конечно же будет другим.



    Кстати, почитал тут стандарт на досуге (С '99 года): результат выражения ++i + ++i + i++ + i++ определён: (i+1) + (i+2) + (i+2) + (i+3). ну и последующее увеличение значения i на 4. То есть если на входе i == 8, то и на выходе -- тоже. Кстати gcc именно это и делает. Не знаю почему у vito gcc отказался компилировать... Либо версия gcc старая (у мя 3.3.6), либо ты пробелы не везде поставил (i+++i согласно стандарту должно разбиваться на токены так: `i' `++' `+' `i', но не `i' `+' `++' `i'), либо я даже не знаю.
     
  20. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Народ, вот неплохая ссылка по теме.