i++ против ++i

Тема в разделе "WASM.BEGINNERS", создана пользователем intel_x128, 10 май 2011.

  1. dinoweb

    dinoweb Дмитрий

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    129
    Адрес:
    Россия. Красноярск
    Lunar_
    пример некорректный. некоторые компиляторы на него не ворнинг а еррор скажут, что правильнее.

    постфиксный оператор определяется вот так:
    Код (Text):
    1. class MyInt
    2. {
    3.   int val;
    4. public:
    5.   MyInt(): val(0) {}
    6.   void operator++(int)
    7.   {
    8.     val += 1;
    9.   }
    10.   int GetVal() const
    11.   {
    12.     return val;
    13.   }
    14. };
    15.  
    16. int main(int argc, char *argv[])
    17. {
    18.   MyInt a;
    19.   a++;
    20.   printf("a = %d\n", a.GetVal());
    21.   return 0;
    22. }
    и ворнинга не будет
     
  2. qwe8013

    qwe8013 New Member

    Публикаций:
    0
    Регистрация:
    28 май 2009
    Сообщения:
    198
    spa
    Ну, у меня в более сложную конструкцию не превратится, т.к. я считаю не читабельным писать в выражении i++ или ++i, и на мой взгляд спор не продуктивен, так что вы выиграли.
     
  3. deLight

    deLight New Member

    Публикаций:
    0
    Регистрация:
    26 май 2008
    Сообщения:
    879
    Для целочисленных встроенных типов можно:

    __asm { inc }

    Можно обернуть в макрос, мало кода, легко морфить.
     
  4. izl3sa

    izl3sa New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2010
    Сообщения:
    164
    Адрес:
    Spb
    2dinoweb
    у вас постфиксный оператор кривой таки =) он же должен значение возвращать =)

    MyInt operator++(int)
    {
    MyInt tmp(*this);
    val += 1;
    return tmp;
    }

    обычно также постфиксный через префиксный делают, но в этом случае все просто =). Также конечно должен быть копирующий конструктор, но сейчас и синтезируемого хватит. И данный пример ярко показывает почему постфиксные операторы не желательно использовать для объектов. Да и оптимизатор не всегда прочухает где можно сооптимизировать в отличие от встроенных типов. Поэтому следует различать постфиксные операторы для классов и встроенных типов.

    2deLight
    я не буду объяснять почему это говнокод, ок? =)

    2qwe8013
    >> т.к. я считаю не читабельным писать в выражении i++ или ++i
    +10000
     
  5. fsd

    fsd New Member

    Публикаций:
    0
    Регистрация:
    4 июл 2010
    Сообщения:
    353
    но почемуже, расскажите
     
  6. deLight

    deLight New Member

    Публикаций:
    0
    Регистрация:
    26 май 2008
    Сообщения:
    879
    fsd
    +1
    интересно послушать
     
  7. Lunar_

    Lunar_ New Member

    Публикаций:
    0
    Регистрация:
    3 май 2011
    Сообщения:
    53
    Прочти предыдущие посты, мы как раз это и обсуждаем.

    ))) Ага, покормите тролля) Почему асм-вставка с дефайном в с++ коде, заменяющая инкремент это гуан)
     
  8. izl3sa

    izl3sa New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2010
    Сообщения:
    164
    Адрес:
    Spb
    2Lunar_
    а я всё думал как ответить =))
     
  9. dinoweb

    dinoweb Дмитрий

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    129
    Адрес:
    Россия. Красноярск
    izl3sa
    я только привёл пример без ворнинга, дописав int. цели сделать рабочий пример не было :).

    с необходимостью соблюдать элементарные правила языка я полностью согласен, они оправданы опытом.
    можно нарабатывать свой опыт, и приходить к этому, несколько раз наступив на грабли, а можно использовать чужой опыт, и не сталкиваться со многими проблемами.
     
  10. johnfound

    johnfound New Member

    Публикаций:
    0
    Регистрация:
    12 фев 2003
    Сообщения:
    74
    Адрес:
    Bulgaria
    Читая такие темы, лишний раз убеждаюсь что правильно решил никогда не писать на языки, имя которых начинается на "C". :lol:
     
  11. fsd

    fsd New Member

    Публикаций:
    0
    Регистрация:
    4 июл 2010
    Сообщения:
    353
    не томите
     
  12. johnfound

    johnfound New Member

    Публикаций:
    0
    Регистрация:
    12 фев 2003
    Сообщения:
    74
    Адрес:
    Bulgaria
    А эсли в теме, вот так лучше:
    Код (Text):
    1. ; x=++i
    2. inc eax
    3. mov ebx, eax
    4.  
    5. ; x=i++
    6. mov  ebx, eax
    7. inc    eax
     
  13. h0t

    h0t Member

    Публикаций:
    0
    Регистрация:
    3 апр 2011
    Сообщения:
    735
    Жестоко))
     
  14. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Потому что в остальных выражениях разница между префиксным и постфиксным оператором очевидна.

    Чего тут томить.
    Собери потом такой код под любую архитектуру, кроме х86.
    К тому же даже на х86 ассемблерная вставка - это палки в колёса оптимизатору.
     
  15. fsd

    fsd New Member

    Публикаций:
    0
    Регистрация:
    4 июл 2010
    Сообщения:
    353
    cppasm
    это всё?
     
  16. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    fsd
    А вам мало?:)
     
  17. bug1z

    bug1z New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2008
    Сообщения:
    228
    aсм встaвки нужно использовaть в сaмом крaйнeм случae, когдa бeз них нe обойтись. А использовaть ee в нaшeм случae кaк минимум нe профeссионaльно.