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

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

  1. intel_x128

    intel_x128 New Member

    Публикаций:
    0
    Регистрация:
    17 май 2009
    Сообщения:
    345
    Все советуют добавлять единицу вот так ++i, но такой способ на мой взгляд совершенно не читабелен.
    Неудобно мне и все тут.

    Скажите, насколько хуже вариант i++?
    В чем принципиальная разница?
     
  2. Igor1024

    Igor1024 Васил Троянов Боянов (Azis)

    Публикаций:
    0
    Регистрация:
    15 окт 2010
    Сообщения:
    345
    Адрес:
    Sliven, Bulgaria
    Где-то я читал, что при i++ создаются дополнительные объекты и вообще этот вариант больше ПВ отнимает... Тоже интересно.
     
  3. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.329
    разница будет, когда будешь использовать присваивания
    Код (Text):
    1. int x = i++;
    или циклы типа
    Код (Text):
    1. while(i--)
    2. {
    3. ...
    4. }
     
  4. Lunar_

    Lunar_ New Member

    Публикаций:
    0
    Регистрация:
    3 май 2011
    Сообщения:
    53
    Как раз, очень читабелен, потому что понятно, что происходит - увеличение или высчитывания значения с последующим увеличением; просто ты уже привык.
    Разница принципиальна и заключается в том, что ++i - это префиксный инкремент, а i++ - постфиксный.

    При использовании постфиксного, состояние объекта до инкремента/декремента сохраняется, поэтому компилятор может сгенерить код, в котором состояние объекта реально будет сохраняться, например, в стеке, хотя у меня пример такой ситуации по-быстрому воссоздать не получилось.
    Вобщем, пишите "правильно": для того, чтобы увеличить значение переменной на единицу правильнее использовать префиксный ++i.
     
  5. izl3sa

    izl3sa New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2010
    Сообщения:
    164
    Адрес:
    Spb
    если просто прибавлять единицу то без разницы, но если применяется в выражениях то разница очевидна:
    j = ++i; не аналогично j = i++;
    для встроенных типов оптимизация нормально отработает.
    Для объектов все немного не так, если для префиксного оператора можно возвращать ссылку, то для постфиксного, чтобы соответствовать встроенным операторам, необходимо перед инкрементом создавать временный объект и возвращать его по значению.
     
  6. Lunar_

    Lunar_ New Member

    Публикаций:
    0
    Регистрация:
    3 май 2011
    Сообщения:
    53
    Оптимизация конкретного компилятора никак не может являться аргументом в пользу неправильного использования операторов языка)
     
  7. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    :facepalm:
    в поиск
     
  8. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    GoldFinch
    +1
     
  9. qwe8013

    qwe8013 New Member

    Публикаций:
    0
    Регистрация:
    28 май 2009
    Сообщения:
    198
    Lunar_
    Где не правильное использование?
    Если не использовать в выражениях, а просто прибавлять единицу, то
    Код (Text):
    1. i++;
    будет полностью эквивалентно
    Код (Text):
    1. ++i;
    Причём здесь конкретные компиляторы?
     
  10. SadKo

    SadKo Владимир Садовников

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.610
    Адрес:
    г. Санкт-Петербург
    Вся разница ++i или i++ становится очевидна на достаточно весомых итераторах. i++ создаёт дополнительные расходы на создание копии объекта в стеке. На int в плане траты ресурсов разницы никакой нет.
     
  11. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    сколько видел, i++ просто преобразовывалось в 2 операции - i и i += 1. это для простых типов. а если как оператор пользовательских классов, то тут как создатель его намудрит.
     
  12. Microedition

    Microedition Active Member

    Публикаций:
    0
    Регистрация:
    5 июн 2008
    Сообщения:
    814
    Если речь не идет о C++, то разницы нет.
     
  13. Lunar_

    Lunar_ New Member

    Публикаций:
    0
    Регистрация:
    3 май 2011
    Сообщения:
    53
    В _чем_ оно эквивалентно? В сгенерированом коде? Я говорю о стиле вообще, а не о конкретном примере в конкретном случае. Не стоит писать оператор постфиксного присваивания там, где исходя из задачи надо использовать префиксный, даже если на работу программы это не повлияет. Примерно так же, как не стоит включать лишние заголовки в исходный код, хотя он и с ними и без них одинаково будет компилироваться, в чём разница ?

    Как пример можно привести ситуацию, когда придется изменить тип int на какой-нибудь сложный тип, описаный классом (что-то дробное и хитрое, к примеру).
     
  14. h0t

    h0t Member

    Публикаций:
    0
    Регистрация:
    3 апр 2011
    Сообщения:
    735
    Разница конечно есть, если прочесть описание оператора. Но не одного компилятора который бы создавал дополнительную переменную (с простыми типами) в релизе я не видел. Что на счет "не читабельности" то не вижу особых проблем с этим, просто дело привычки...
    И я не понимаю чем принципиально постфиксный оператор от префиксного в С++ так отличается вроде он такой же как и в С.
    Еcтm подозрение что конструкция вида volatile int i=0; ....i++) будет лишний раз сохранять переменную, но проверять это лень)

    P.S. сам пишу ++i))) мне больше нравится.
     
  15. izl3sa

    izl3sa New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2010
    Сообщения:
    164
    Адрес:
    Spb
    2h0t
    как выше писал, отличается, тем что возможна перегрузка оператора для класса. И в силу описанных причин, будет дополнительно вызыватся конструктор копирования два раза и деструктор, тк объект нужно будет возвращать по значению.

    >> будет лишний раз сохранять переменную, но проверять это лень
    будет всегда сохранять, но оптимизирующие компиляторы это всегда прочекают для встроенных типов. Но как справедливо заметил Lunar_ есть ещё до жопы говнокомпиляторов (tcc, lcc и тд) которые вообще не имеют оптимизации и сгенерят тебе тонну гкода.
     
  16. Lunar_

    Lunar_ New Member

    Публикаций:
    0
    Регистрация:
    3 май 2011
    Сообщения:
    53
    h0t, ты просто мыслишь то, что получится в результате, а мы уже обсуждали то, как правильно само по себе) Гармония, блин..)
     
  17. qwe8013

    qwe8013 New Member

    Публикаций:
    0
    Регистрация:
    28 май 2009
    Сообщения:
    198
    Lunar_
    Если не использовать в выражениях, то можно использовать оба варианта, и слово "надо" здесь не приемлемо.
    Да, если для вашего компилятора не эквивалентно - используйте другой компилятор.
    Поясните пожалуйста, что это за такой стиль вообще.
    Разница в лишних строчках кода.
     
  18. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    qwe8013
    а когда вдруг из i++ она превратится в более сложную конструкцию, вы будете не просто дописывать "x =" ,а еще и исправлять с какой стороны ++? что же очень "рационально".
     
  19. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    И как часто у тебя i++ внутри for() превращается в более сложную конструкцию, ещё и с оператором присваивания?
     
  20. Lunar_

    Lunar_ New Member

    Публикаций:
    0
    Регистрация:
    3 май 2011
    Сообщения:
    53
    ОМГ, друзья, при всём уважении: вы пытаетесь поспорить о фигне какой-то, ИМХО. Есть язык С. Есть вполне понятное правило: там, где надо увеличить переменную на 1 - пиши ++переменная, а там, где надо сначала взять значение, а потом и увеличить - пиши переменная++. При чем тут компиляторы и какой код они генерят в конкретных случаях ?
    При чем тут то, что в какой-то конкретной ситуации нет разницы как писать - "превед" или "привет", всё равно вас поймут ? Если хотите настоящий пример, почему не надо игнорировать правила языка - вот вам пример: у меня перемнная i типа int превращается в процессе рефакторинга в переменную типа MyInt.

    и имеем варнинг

    Будете доказывать, что от наличия варнингов в моём компиляторе сгенерированый в этом случае код не изменится, ударяясь в какой-то такой "антиэстетизм" ?

    cppasm, а почему обязательно внутри for() ? О for() речи не было нигде.